题目
题解
46. 全排列【中等】的进阶题,46题中nums数组不含重复数字
- 不能填已经填过的数?
使用标记数组visited标记已经填过的数 - 怎么解决重复排列的问题?
排序,使相同数字相邻,选数字时跳过选过的重复数字
class Solution {
int n;
boolean[] visited;
List<Integer>set=new ArrayList<>();
List<List<Integer>>res=new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
n=nums.length;
visited=new boolean[n];
Arrays.sort(nums);
backtrack(nums,0);
return res;
}
//start位置填数
public void backtrack(int[] nums,int start){
if(start==n){
res.add(new ArrayList<>(set));
return;
}
for(int i=0;i<n;i++){
if(visited[i]||(i>0&&nums[i]==nums[i-1]&&!visited[i-1]))
continue;
set.add(nums[i]);
visited[i]=true;
backtrack(nums,start+1);
visited[i]=false;
set.remove(start);
}
}
}
时间复杂度: O ( n × n ! ) O(n\times n!) O(n×n!)
空间复杂度: O ( n ) O(n) O(n)