题目链接
题目描述
输入一组数字(可能包含重复数字),输出其所有的排列方式。
数据范围
输入数组长度 [0,6]。
样例 输入:[1,2,3]
输出:
[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
考察知识点
- 回溯
注意:虽然题目中没有说明,但是答案中不能有重复的元组
可以根据used数组避免!
- 先将数组进行排序
- 然后在这里进行去重
if(i != 0 && nums[i] == nums[i - 1] && used[i - 1] == true) continue;
题目代码
class Solution {
List<List<Integer>> res = new ArrayList<>();
List<Integer> resOne = new ArrayList<>();
public List<List<Integer>> permutation(int[] nums) {
Arrays.sort(nums);
boolean[] used = new boolean[nums.length];
backtracking(nums, used);
return res;
}
public void backtracking(int[] nums, boolean[] used) {
for(int i = 0; i < nums.length; i ++){
if(resOne.size() == nums.length){
res.add(new ArrayList(resOne));
return;
}
// 当前元素不能重复被取
if(used[i] == true) continue;
// 避免list中重复,比如112,i=0的时候已经遍历完已1开头的,i=1的时候,还要再遍历一遍,避免这种情况
if(i != 0 && nums[i] == nums[i - 1] && used[i - 1] == true) continue;
resOne.add(nums[i]);
used[i] = true;
backtracking(nums, used);
used[i] = false;
resOne.remove(resOne.size()-1);
}
}
}