AcWing 51. 数字排列--Java代码
原题链接
中等
作者:
木木灬
,
2019-04-18 15:20:42
,
所有人可见
,
阅读 2751
Java 代码
class Solution {
public List<List<Integer>> permutation(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
Arrays.sort(nums);
backtrack(list, new ArrayList<>(), nums, new boolean[nums.length]);
return list;
}
private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, boolean [] used){
if(tempList.size() == nums.length){
list.add(new ArrayList<>(tempList));
} else{
for(int i = 0; i < nums.length; i++){
if(used[i] || i > 0 && nums[i] == nums[i-1] && !used[i - 1]) continue;
used[i] = true;
tempList.add(nums[i]);
backtrack(list, tempList, nums, used);
used[i] = false;
tempList.remove(tempList.size() - 1);
}
}
}
}
去重真的妙,在回溯的时候
楼主你好,我想请教一下关于去重代码的思路
if(used[i] || i > 0 && nums[i] == nums[i-1] && !used[i - 1]) continue;
我觉得这个去重的思路就是保持重复数字的顺序不变,比如排序的结果是2和2’,在进行扫描排列的时候,如果2没有加入到序列中,2’不会加入到序列里,从而保证不会出现22’和2‘2的重复。只有22’一种结果。
这个同样没看明白,代码怎么保证重复数字的顺序不变呢?当上一个数和当前数相同时,且上个数为false?
!used[i-1]时,如果continue了说明前一个相同的数已经加入path,第i个就不需要再加;你说的上一个数是false的时候,if判断的第一个条件就是false了,所以肯定continue不了
想保证重复数字顺序不变就需要保证相同数字的相对顺序不变,例如a1,a2,b 要想这串数字重复则一定是a2,a1,b此时a1,a2的相对顺序就发生了改变。带着这个思路,每次添加数字时,若此数字与前一个数字相等的话,只有前面的数字若还没有被选择,那么此数字也不能被选择,因为若前面的还没选就选此数字,必然会导致相对顺序发生改变。所以只要避免相对顺序发生改变就能避免出现重复数字