至今不会算时间复杂度,算分课开头就该好好听的。这个坑不知道什么时候能补上。。。
拓展:全排列2
题目
https://leetcode-cn.com/problems/permutations
方法二
分析
使用visited[]数组来标记当前位置的数是否被使用过,省去每次遍历寻找是否已被使用的时间。
是一种牺牲空间换时间的做法。
复杂度
时间复杂度:O(N×N!)
空间复杂度:O(N×N!)。
递归树深度 NlogN;
全排列个数 N!,每个全排列占空间 N。取较大者。
代码
class Solution {
List<List<Integer>> res;
int[] nums;
int[] visited;
public List<List<Integer>> permute(int[] nums) {
if(nums==null||nums.length==0)
return new ArrayList<List<Integer>>();
this.nums=nums;
this.visited=new int[nums.length];
res=new ArrayList<List<Integer>>();
dfs(new ArrayList<Integer>(),0);
return res;
}
public void dfs(ArrayList<Integer> tmp,int index){
if(index==nums.length){
res.add(new ArrayList(tmp));
return;
}
for(int i=0;i<nums.length;i++){
//这个位置的数已经被使用过
if(visited[i]==1)
continue;
visited[i]=1;
tmp.add(nums[i]);
dfs(tmp,index+1);
visited[i]=0;
tmp.remove((int)index);
}
}
}
结果
方法一
这是我一开始写的,我觉得改了的方法二更好
代码
class Solution {
List<List<Integer>> res;
int[] nums;
public List<List<Integer>> permute(int[] nums) {
if(nums==null||nums.length==0)
return new ArrayList<List<Integer>>();
this.nums=nums;
res=new ArrayList<List<Integer>>();
dfs(new ArrayList<Integer>(),0);
return res;
}
public void dfs(ArrayList<Integer> tmp,int index){
if(index==nums.length){
res.add(new ArrayList(tmp));
return;
}
for(int i=0;i<nums.length;i++){
int flag=0;
if(index-1>=0){
for(int j=index-1;j>=0;j--){
if(nums[i]==tmp.get(j)){
flag=1;
break;
}
}
}
if(flag==1)
continue;
tmp.add(nums[i]);
dfs(tmp,index+1);
tmp.remove((int)index);
}
}
}