47.全排列Ⅱ
程序员文章站
2022-07-12 12:34:35
...
题目分析
首先这个题和46.全排列不同于给的nums
可能会有重复数字,这就导致产生的全排列会相同
比如[1,1,2]
和 [1,3,2]
这样1会替换3,导致出现相同的
去重:
其实就是让每个数组在各个位置出现有且只有一次,才会不重复
Solution
public List<List<Integer>> permuteUnique(int[] nums) {
if (nums == null) return null;
List<List<Integer>> list = new ArrayList<>();
if (nums.length == 0) return list;
dfs(0, nums, list);
return list;
}
private void dfs(int idx, int[] nums, List<List<Integer>> list) {
// 不能再往下搜索
if (idx == nums.length) {
List<Integer> result = new ArrayList<>();
for (int value : nums) {
result.add(value);
}
list.add(result);
return;
}
// 枚举这一层所有可以做出的选择
for (int i = idx; i < nums.length; i++) {
// 要保证一个数字在idx位置只会出现一次
if (isRepeat(nums, idx, i)) continue;
swap(nums, idx, i);
dfs(idx + 1, nums, list);
swap(nums, idx, i);
}
}
private boolean isRepeat(int[] nums, int idx, int i) {
for (int j = idx; j < i; j++) {
if (nums[j] == nums[i]) return true;
}
return false;
}
private void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}
Reference:小码哥MJ
上一篇: Linux 进程信号