46. 全排列
回溯:
java
class Solution {
public List<List<Integer>> permute(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
List<Integer> path = new ArrayList<>();
boolean[] used = new boolean[nums.length];
backtrack(nums,ans,path,used);
return ans;
}
private void backtrack(int[] nums,List<List<Integer>> ans,List<Integer> path,boolean[] used){
//确保往下搜索完
if(path.size() == nums.length){
ans.add(new ArrayList<>(path));
return;
}
//确保第一个数遍历完,1 2 3....
for(int i = 0;i<nums.length;i++){
//没选的进来
if(!used[i]){
path.add(nums[i]);
used[i] = true;
//确保选完
backtrack(nums,ans,path,used);
//回溯删除
used[i] = false;
path.remove(path.size()-1);
}
}
}
}
时间复杂度:O(N*N!)
java
public ArrayList(Collection<? extends E> c) {
// 1. 把原集合变成数组
Object[] a = c.toArray();
// 2. 这里的 Arrays.copyOf 内部就是一个 for 循环
// 它会把 a 数组里的每一个元素,一个一个复制到新创建的 ArrayList 内部数组里
this.elementData = Arrays.copyOf(a, a.length, Object[].class);
}
每一个new ArrayList需要遍历N次,一共需要N!,所有总时间复杂度为N*N!
空间复杂度:O(N)