Backtracking(回溯) 系列三subsets

这类题的共同点都是用backtracking,建立一个helper API然后recursion

  • input nums needs sort,为了方便remove duplicates如果input有duplicates(subsets II)
    sort(nums.begin(), nums.end())

helper API有几个共同点:
(跟combinations不一样的是)

  • exit condition:
    用start == nums.size()作为结束条件,而且只是return。
  • push_back to res的时间不一样
    在loop里,每次push_back to row,row同时也push_back to res
    (跟combinations一样的是)
  • input:res,row,start
  • 如果input candidates有重复元素,需要remove duplicates,
    while(i+1 < candidates.size() && candidates[i] == candidates[i+1]) i++;
    比如permutation II。
  1. Subsets
    Given a set of distinct integers, nums, return all possible subsets (the power set).
    Note: The solution set must not contain duplicate subsets.
class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>row;
        res.push_back(row);
        
        helper(res, row, nums, 0);
        return res;
        
    }
    
    void helper(vector<vector<int>>&res, vector<int>& row, vector<int>& nums, int start)
    {
        if(start == nums.size())
        {
            return;
        }
        
        for(int i = start; i < nums.size(); i++)
        {
            row.push_back(nums[i]);
            res.push_back(row);
            helper(res, row, nums, i + 1);
            row.pop_back();
        }
    }
};
  1. 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.
class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int>row;
        res.push_back(row);
        sort(nums.begin(), nums.end());
        helper(res, row, nums, 0);
        return res;
        
    }
    
    void helper(vector<vector<int>>&res, vector<int>& row, vector<int>& nums, int start)
    {
        if(start == nums.size())
        {
            return;
        }
        
        for(int i = start; i < nums.size(); i++)
        {
            row.push_back(nums[i]);
            res.push_back(row);
            helper(res, row, nums, i + 1);
            row.pop_back();
            while(i+1 < nums.size() && nums[i] == nums[i+1]) i++;
        }
        
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43476349/article/details/83990487