原题链接:47. Permutations II
欢迎优化!
【思路】
本题考查的是回溯算法。与 46. Permutations 不同的是本题数组中的元素可能重复。为此增加了一个记录数组visit。重点在于要能理解!visited.contains(i-1)
要理解这个,首先要明白i作为数组内序号,i是唯一的,给出一个排好序的数组,[1,2,2]
第一层递归 第二层递归 第三层递归
[1] [1,2] [1,2,2]
序号:[0] [0,1] [0,1,2]
这种都是OK的,但当第二层递归i扫到的是第二个"2",情况就不一样了
[1] [1,2] [1,2,2]
序号:[0] [0,2] [0,2,1]
所以这边判断的时候!visited.contains(0)就变成了true,不会再继续递归下去,跳出循环。主要就是为了去除连续重复存在的,很神奇反正 = =||
public List<List<Integer>> permuteUnique(int[] num) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
ArrayList<Integer> list = new ArrayList<Integer>();
int[] visited = new int[num.length];
Arrays.sort(num);
helper(result, list, visited, num);
return result;
}
public void helper(List<List<Integer>> result, List<Integer> list, int[] visited, int[] num) {
if(list.size() == num.length)
result.add(new ArrayList<Integer>(list));
for(int i = 0; i < num.length; i++) {
if (visited[i] == 1 || (i != 0 && num[i] == num[i - 1] && visited[i - 1] == 0))
continue;
visited[i] = 1;
list.add(num[i]);
helper(result, list, visited, num);
list.remove(list.size() - 1);
visited[i] = 0;
}
}
30 / 30
test cases passed. Runtime: 6 ms Your runtime beats 45.37% of javasubmissions.
欢迎优化!