47. Permutations II
Description
描述:https://leetcode.com/problems/permutations-ii/description/
题意:返回一个数组(数组中可能有重复)中所有的唯一的全排列。
Solution: (Java)
class Solution {
List<List<Integer>> result = new ArrayList<>();
int[] visited;
public List<List<Integer>> permuteUnique(int[] nums) {
List<Integer> list = new ArrayList<>();
visited = new int[nums.length];
Arrays.sort(nums);
int count = 0;
backtracking(nums, list, count);
return result;
}
public void backtracking(int[] nums, List<Integer> list, int count) {
if (count == nums.length) {
result.add(new ArrayList<>(list));
}
for (int i = 0; i < nums.length; i++) {
if (visited[i] == 0) {
visited[i] = 1;
list.add(nums[i]);
backtracking(nums, list, count+1);
int rm = list.remove(list.size()-1);
visited[i] = 0;
while ((i+1 < nums.length) && rm == nums[i+1])
i++;
}
}
}
}
思路
- 本题是 46题 的扩展,稍微修改46题的代码即可,runtime 1ms,超过100%;
- 不同的就是要先对数组排个序,然后回溯之后去除重复的遍历即可;
- 有个小tips,就是
result
添加的时候,把之前的 “遍历添加到新list中” 改为result.add(new ArrayList<>(list));
之后,runtime 从2ms超过57%马上变成超过100%!可见其高效。