题目描述
AC代码
暴力做法.仅仅是在LeetCode 46. Permutations的基础上,多了一个去重。
class Solution {
int len;
List<List<Integer>> ans;
List<Integer> path;
boolean[] vis;
public List<List<Integer>> permuteUnique(int[] nums) {
len=nums.length;
ans=new ArrayList<>(len);
path=new ArrayList<>(len);
vis=new boolean[len];
Arrays.sort(nums);
dfs(nums,0);
return ans;
}
void dfs(int []nums,int k){
if(k==len)
{
if(!ans.contains(path))
ans.add(new ArrayList<>(path));
return;
}
for(int i=0;i<len;i++){
if(!vis[i]){
vis[i]=true;
path.add(nums[i]);
dfs(nums,k+1);
path.remove(path.size()-1);
vis[i]=false;
}
}
}
}
优化:
//枚举每个位置放不同的数
class Solution{
List<List<Integer>> res=new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
List<Integer> temp=new ArrayList<>();
boolean[] visited=new boolean[nums.length];
dfs(nums,visited,temp);
return res;
}
public void dfs(int[] nums, boolean[] visited,List<Integer> temp)
{
if(temp.size()==nums.length)
{
res.add(new ArrayList<>(temp));
return;
}
for(int i=0;i<nums.length;i++)
{
if(!visited[i])
{
visited[i]=true;
temp.add(nums[i]);
dfs(nums,visited,temp);
temp.remove(temp.size()-1);
visited[i]=false;
while(i+1<nums.length && nums[i]==nums[i+1])
i++;
}
}
}
}