February 10, 2019

90. Subsets II

90. Subsets II

要没有重复的元素,要保证递归树的每一层元素不重复。这样就需要先排序,然后再执行 dfs 的时候跳过每层重复元素的情况。 Time O(2^n) Space O(n)

⚠️要先排序!

这里有一个讲的很清楚的视频:https://www.youtube.com/watch?v=lCvL8htQ1iI

class Solution {
    public List<List<Integer>> subsetsWithDup(int[] nums) {
        List<List<Integer>> res = new ArrayList<>();
        if (nums == null) {
            return res;
        }
        List<Integer> cur = new ArrayList<>();
        Arrays.sort(nums);
        helper(nums, 0, cur, res);
        return res;
    }
    
    private void helper(int[] nums, int index, List<Integer> cur, List<List<Integer>> res) {
        res.add(new ArrayList<>(cur));
        for (int i = index; i < nums.length; i++) {
            
            if (i != index && nums[i - 1] == nums[i]) {
                continue; // 注意这里去重的处理
            }
            
            cur.add(nums[i]);
            helper(nums, i + 1, cur, res); 
            cur.remove(cur.size() - 1);
        }
    }
}
class Solution:
    def subsetsWithDup(self, nums: 'List[int]') -> 'List[List[int]]':
        nums.sort()
        res = []
        self.helper(0, nums, [], res)
        return res
    
    def helper(self, index, nums, cur, res):
        res.append(cur)
        for i in range(index, len(nums)):
            # skip duplicate
            if not (i != index and nums[i - 1] == nums[i]):
                self.helper(i + 1, nums, cur + [nums[i]], res)
comments powered by Disqus