- 题目描述
给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。
提示:
1 <= nums.length <= 8
-10 <= nums[i] <= 10
来源:LeetCode
- 示例
- 示例 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]]
- 思路分析
在#46的基础上加上一个条件:同一轮循环中如果遇到相同的数,就直接跳过。
- JAVA实现
class Solution {
public List<List<Integer>> permuteUnique(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> permU = new ArrayList<>();
List<Integer> small = new ArrayList<>();
int[] used = new int[nums.length];
for(int i=0;i<nums.length;i++) used[i] = 0;
tb(nums, permU, small, used);
return permU;
}
public void tb(int[] nums, List<List<Integer>> permU, List<Integer> small, int[] used) {
boolean all_used = true;
for(int i=0; i<nums.length; i++) {
//如果这个数和上一个数相同而且上一个数在这一轮循环之前也是没有用过的,就跳过
//第三个条件:如果上一个数在这一轮循环之前是用过的,那就不会导致重复,因为是相同的数在不同的位置
if(i>0 && nums[i] == nums[i-1] && used[i-1]==0) continue;
if(used[i] == 0) {
all_used = false;
small.add(nums[i]);
used[i] = 1;
tb(nums, permU, small, used);
used[i] = 0;
small.remove(small.size()-1);
}
}
if(all_used == true) permU.add(new ArrayList(small));
}
}