Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: [1,2,2]
Output:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
就加个continue就行了。
continue和break的区别:break结束双循环的外面一层,continue只结束里面一层
尝试用自然语言描述一下:
这个元素和之前i - 1的重复,就跳过这个元素。
i++,到了数组中的下一个元素,就没有之前的i - 1了,而是新的i - 1
所以可以保证不重复
从case理解:1122333
i = 5 递归是往深了走,所以一下到后面去了。作为一个经常重复的i被踢了,还是那句话:T的是i
nums[i] = 3
这时候要跳过
i = 4 后面就在recursive的过程中不断踢人。
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 4
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 2
nums[i] = 2
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 4
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 4
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 4
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 2
nums[i] = 2
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
i = 4
nums[i] = 3
这时候要跳过
i = 5
nums[i] = 3
这时候要跳过
class Solution { public List<List<Integer>> subsetsWithDup(int[] nums) { List<List<Integer>> list = new ArrayList<>(); Arrays.sort(nums); backtrack(list, new ArrayList<>(), nums, 0); return list; } private void backtrack(List<List<Integer>> list, List<Integer> tempList, int [] nums, int start){ list.add(new ArrayList<>(tempList)); for(int i = start; i < nums.length; i++){ if (i > start && (nums[i] == nums[i - 1])) { continue; } tempList.add(nums[i]); backtrack(list, tempList, nums, i + 1); tempList.remove(tempList.size() - 1); } } }