1、例题Permutation
Given a collection of distinct numbers, return all possible permutations.
For example,
[1,2,3] have the following permutations:
[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], and [3,2,1].
public List<List<Integer>> permute(int[] nums) {
// Implement this method.
}
1)边界条件:组合问题,输入为空,输出为空;其他情况都是正常的。
2)思路:第一个位置先选一个数,第二位置从剩下的两个数里面选一个数,第三个位置只能选最后一个数。
那么N个数的Level-N问题这样化简:第一个位置从N个数里面选择一个,剩余N-1位置和N-1个数,生成一个Level-(N-1)的问题,形成递归。
3)代码实现
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> numList = new List<List<Integer>>();
for (int i = 0 ; i < nums.length; i++) {
numList.add(nums[i]);
}
return permutes(new List<Integer>(); numList);
}
/*先实现递归函数主体*/
List<List<Integer>> permutes(List<Integer> cur, List<Integer> nums)
{ List<List<Integer>> results = new List<List<Integer>>();
if (0 == nums.size()) {
///List<Integer> result = new ArrayList<>(cur); ///不需要这一行,因为上一层函数已经申请了新的内存空间
results.add(result);
return results;
}
for (int i = 0; i < nums.size(); i++) {
List<Integer> newCur = new ArrayList<>(cur);
newCur.add(nums.get(i));
List<Integer> newNum = new ArrayList<>(nums);
newNums.remove(i);
result.addAll(permutes(newCur, newNum));
}
return results;
}
}
4)时间复杂度:O(n!);空间复杂度:O(n!)---空间复杂度似乎不准
5)其他解法
List<List<Integer>> permutes(List<Integer> cur, List<Integer> num) {
}