题目描述
题解
我用了46递归回溯的方法,然后用set去除了重复的元素
没想到也能直接提交通过
class Solution {
boolean[] isUsed = new boolean[10000];
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ret = new ArrayList<>();
if(nums.length==0)
return ret;
ArrayList<Integer> p = new ArrayList<>();
findPermute(nums,0,p,ret);
Set<List<Integer>> set = new HashSet<>(ret);
// 得到去重后的新集合
List<List<Integer>> rett = new ArrayList<>(set);
return rett;
}
private void findPermute(int[] nums, int offset, ArrayList<Integer> p,List<List<Integer>> ret)
{
if(offset>=nums.length)
{
ret.add(new ArrayList<Integer>(p));
return;
}
for(int i = 0; i<nums.length; i++)
{
if(!isUsed[i])
{
isUsed[i] = true;
p.add(nums[i]);
//System.out.println(p.toString());
findPermute(nums,offset+1,p,ret);
p.remove(p.size()-1);
isUsed[i] = false;
}
}
}
}
但是很显然,这不是优解,运行时间肯定也比较久
使用swap去做
import java.util.*;
public class Leetcode_47 {
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
if (nums==null || nums.length==0) { return ans; }
permute(ans, nums, 0);
return ans;
}
private void permute(List<List<Integer>> ans, int[] nums, int index) {
if (index == nums.length) {
List<Integer> temp = new ArrayList<>();
for (int num: nums) { temp.add(num); }
ans.add(temp);
return;
}
Set<Integer> appeared = new HashSet<>();
for (int i=index; i<nums.length; ++i) {
if (appeared.add(nums[i])) {
swap(nums, index, i);
permute(ans, nums, index+1);
swap(nums, index, i);
}
}
}
private void swap(int[] nums, int i, int j) {
int save = nums[i];
nums[i] = nums[j];
nums[j] = save;
}
public static void main(String[] args)
{
Leetcode_47 a = new Leetcode_47();
int[] nums = {1,1,3};
List<List<Integer>> ret = a.permuteUnique(nums);
System.out.println(ret.toString());
}
}