# LeetCode 47. 全排列 II

class Solution {
boolean[] vis;
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> perm = new ArrayList<Integer>();
vis = new boolean[nums.length];
Arrays.sort(nums);
backtrack(nums, ans, 0, perm);
return ans;
}

public void backtrack(int[] nums, List<List<Integer>> ans, int idx, List<Integer> perm){
if(idx == nums.length){
ans.add(new ArrayList<Integer>(perm));
return;
}
for(int i = 0; i < nums.length; i++){
if(vis[i] || (i > 0 && nums[i] == nums[i - 1] && !vis[i - 1])){
continue;
}
perm.add(nums[i]);
vis[i] = true;
backtrack(nums, ans, idx + 1, perm);
vis[i] = false;
perm.remove(idx);
}
}
}

//写法二：用set剪纸
class Solution {
boolean[] vis;
public List<List<Integer>> permuteUnique(int[] nums) {
List<List<Integer>> ans = new ArrayList<List<Integer>>();
List<Integer> perm = new ArrayList<Integer>();
vis = new boolean[nums.length];
Arrays.sort(nums);
backtrack(nums, ans, 0);
return ans;
}

public void backtrack(int[] nums, List<List<Integer>> ans, int idx){
if(idx == nums.length){
ans.add(Arrays.stream(nums).boxed().collect(Collectors.toList()));
return;
}
HashSet<Integer> set = new HashSet<Integer>();
for(int i = idx; i < nums.length; i++){
if(set.contains(nums[i]))
continue;
set.add(nums[i]);
swap(nums, i, idx);
backtrack(nums, ans, idx + 1);
swap(nums, i, idx);
}
}

private void swap(int[] nums, int i, int j){
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
}

• 点赞 1
• 评论
• 分享
x

海报分享

扫一扫，分享海报

• 收藏
• 打赏

打赏

水之积也不厚,则其负大舟也无力

你的鼓励将是我创作的最大动力

C币 余额
2C币 4C币 6C币 10C币 20C币 50C币
• 举报
• 一键三连

点赞Mark关注该博主, 随时了解TA的最新博文

09-18 299

05-20 128
04-23 353
01-21 492
05-21 443
06-10 504
10-29 192
12-27 228
04-05 1万+
12-31
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客