全排列去重-DFS
/**
* https://leetcode-cn.com/problems/permutations-ii/
*/
public class _47_全排列II {
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;
}
public static void main(String[] args) {
_47_全排列II o = new _47_全排列II();
int[] nums = {1, 2, 3};
List<List<Integer>> list = o.permuteUnique(nums);
System.out.println(list);
nums = new int[]{1, 1, 3};
list = o.permuteUnique(nums);
System.out.println(list);
}
}
浙公网安备 33010602011771号