题目:
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
示例 1:
输入:nums = [1,1,2]
输出:
[[1,1,2],
[1,2,1],
[2,1,1]]
示例 2:
输入:nums = [1,2,3]
输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
提示:
- 1 <= nums.length <= 8
- -10 <= nums[i] <= 10
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解法1:递归(标记法)
/**
* 思路:
* 112
* 先排序
* 当前格子数等于了数组长度返回。
* 遍历所有的数,如果当前的数被使用continue
* 如果前一个数等于当前的数,但是前一个数竟然没被标记,说明一件事,当前位置已经放过这个数了。前一个数没被标记 continue
* 往list中加入当前数
* 下钻
* 标记当前数没被访问
* 回撤格子中的数
*/
public List<List<Integer>> permuteUnique(int[] nums) {
ArrayList<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
boolean[] used = new boolean[nums.length];
Arrays.sort(nums);
backtrack(nums,result,list,used,0);
return result;
}
private void backtrack(int[] nums,ArrayList<List<Integer>> result, LinkedList<Integer> list, boolean[] used,int lattice) {
if (lattice==nums.length){
result.add(new ArrayList<>(list));
return;
}
for (int i=0;i<nums.length;i++){
if (used[i])continue;
//112第一个格子走到11的时候!used[i-1]第一个1没访问过,不能向下走
//如果前一个数等于当前的数,但是前一个数竟然没被标记,说明一件事,当前位置已经放过这个数了。
if (i>0&&nums[i]==nums[i-1]&&!used[i-1])continue;
used[i]=true;
list.addLast(nums[i]);
backtrack(nums,result,list,used,lattice+1);
used[i]=false;
list.removeLast();
}
}
时间复杂度:On^2
空间复杂度:On
解法2:递归(交换法)
/**
* 思路:
* 每个格子都可以存放所有数字
* 当前的数和之后的数不同才进行换位
*/
public List<List<Integer>> permuteUnique(int[] nums) {
ArrayList<List<Integer>> result = new ArrayList<>();
LinkedList<Integer> list = new LinkedList<>();
for (int num:nums)list.add(num);
recursive(result,list,0);
return result;
}
private void recursive(ArrayList<List<Integer>> result, LinkedList<Integer> list, int lattice) {
if (lattice==list.size()){
result.add(new ArrayList<>(list));
return;
}
HashSet<Integer> set = new HashSet<>();
for (int i=lattice;i<list.size();i++){
//set看的是上一个格子换位后的剩余数。211,到了第二个格子看的是11(这就是为什么这不能add.nums[x]的原因)
if (set.add(list.get(i))){
Collections.swap(list,lattice,i);
recursive(result,list,lattice+1);
Collections.swap(list,lattice,i);
}
}
}
时间复杂度:On^2
空间复杂度:On