oja*_*jas 12 java algorithm recursion time-complexity
给定一组不同的数字,返回所有可能的排列.
例如,[1,2,3]具有以下排列:
[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3] ,1,2],[3,2,1]]
我的迭代解决方案是:
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
result.add(new ArrayList<>());
for(int i=0;i<nums.length;i++)
{
List<List<Integer>> temp = new ArrayList<>();
for(List<Integer> a: result)
{
for(int j=0; j<=a.size();j++)
{
a.add(j,nums[i]);
List<Integer> current = new ArrayList<>(a);
temp.add(current);
a.remove(j);
}
}
result = new ArrayList<>(temp);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
我的递归解决方案是:
public List<List<Integer>> permuteRec(int[] nums) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (nums == null || nums.length == 0) {
return result;
}
makePermutations(nums, result, 0);
return result;
}
void makePermutations(int[] nums, List<List<Integer>> result, int start) {
if (start >= nums.length) {
List<Integer> temp = convertArrayToList(nums);
result.add(temp);
}
for (int i = start; i < nums.length; i++) {
swap(nums, start, i);
makePermutations(nums, result, start + 1);
swap(nums, start, i);
}
}
private ArrayList<Integer> convertArrayToList(int[] num) {
ArrayList<Integer> item = new ArrayList<Integer>();
for (int h = 0; h < num.length; h++) {
item.add(num[h]);
}
return item;
}
Run Code Online (Sandbox Code Playgroud)
据我所知,迭代解决方案的时间复杂度(大哦)是:n*n(n + 1)/ 2~O(n ^ 3)
我无法弄清楚递归解的时间复杂度.
谁能解释两者的复杂性?
它的输出(这是巨大的),在这个问题上,而不是常规的落实事宜。对于n不同的项目,有n!排列作为答案返回,因此我们至少有O(n!)复杂性。
借助斯特林近似
O(n!) = O(n^(1/2+n)/exp(n)) = O(sqrt(n) * (n/e)^n)
Run Code Online (Sandbox Code Playgroud)
我们可以很容易地看到,O(n!) > O(n^c)对于任何常量c,这就是为什么实现本身添加另一个并不重要,O(n^3)因为
O(n!) + O(n^3) = O(n!)
Run Code Online (Sandbox Code Playgroud)