90. Subsets II

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);
    }
} 
}
View Code
原文地址:https://www.cnblogs.com/immiao0319/p/13205699.html