带重复元素的排列
题目:
描述
给出一个具有重复数字的列表,找出列表所有不同的排列。
样例
样例 1:
输入:
nums = [1,1]
输出:
[
[1,1]
]
解释:
[1,1]的不同排列只有[1,1]。
样例 2:
输入:
nums = [1,2,2]
输出:
[
[1,2,2],
[2,1,2],
[2,2,1]
]
解题思路:首先思考如何去重,先对数组进行排序后再使用标记数组来进行标记,之后进行dfs即可
public class Solution {
/*
* @param : A list of integers
* @return: A list of unique permutations
*/
private List<List<Integer>> ans = new ArrayList();
public List<List<Integer>> permuteUnique(int[] nums) {
// write your code here
Arrays.sort(nums);
dfs(nums, new boolean[nums.length], new ArrayList());
return ans;
}
private void dfs(int[] nums, boolean[] book, List<Integer> list) {
if(list.size() == nums.length) {
ans.add(new ArrayList(list));
return ;
}
for(int i = 0; i < nums.length; i++) {
if(book[i]) {
continue ;
}
// 防止元素重复
// book[i - 1] == false时表示 当前数和前一个数相等并且前一个数已经回溯完成
// 如果此时再对该数进行回溯会导致结果重复
if (i > 0 && nums[i] == nums[i - 1] && !book[i - 1]) {
continue;
}
book[i] = true;
list.add(nums[i]);
dfs(nums, book, list);
list.remove(list.size() - 1);
book[i] = false;
}
}
};