47. 全排列 II
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/permutations-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
注意这里一开始由于固定思维,想需要排序来处理重复问题。其实不用,缓存了每次交换的值,如果遇到重复的,就跳过了,所以不用排序。
List<List<Integer>> ret = new ArrayList<>();
public List<List<Integer>> permuteUnique(int[] nums) {
// Arrays.sort(nums);
dfs(nums,0);
return ret;
}
public void dfs(int[] nums, int index) {
if(index == nums.length) {
List<Integer> list = new ArrayList<>();
for(int i=0;i<nums.length;i++) {
list.add(nums[i]);
}
ret.add(list);
return;
}
// 用来保存用来交换过的值。如果碰到重复的就不再交换了
List<Integer> visited = new ArrayList<>();
for(int i=index;i<nums.length;i++) {
if(visited.contains(nums[i])) {
continue;
}
visited.add(nums[i]);
swap(nums,index, i);
dfs(nums,index+1);
swap(nums,index, i);
}
}
public void swap(int[] nums, int i, int j) {
int tmp = nums[i];
nums[i] = nums[j];
nums[j] = tmp;
}