1. 程式人生 > >Subsets and Subsets II

Subsets and Subsets II

Given a set of distinct integers, nums, return all possible subsets.

Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:

[
 [3],
 [1],
 [2],
 [1,2,3],
 [1,3],
 [2,3],
 [1,2],
 []
]

這道題很明顯是用遞迴來求解,遞迴的方法是,對於每一個元素,有取和不取兩種情況,對於新增的元素,在遞迴返回時還要去掉。注意初始陣列要先排序。

class Solution {
public:
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> path;
        sort(nums.begin(),nums.end());
        find(nums,0,result,path);
        return result;
    }
    void find(vector
<int>
nums, int index, vector<vector<int>>& result, vector<int>& path){ if(index==nums.size()) result.push_back(path); else{ find(nums,index+1,result,path); path.push_back(nums[index]); find(nums,index+1,result,path); path.pop_back(); } } };
Given a collection of integers that might contain duplicates, nums, return all possible subsets.

Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2], a solution is:

[
  [2],
  [1],
  [1,2,2],
  [2,2],
  [1,2],
  []
]

跟第一題的解法一樣,只是在主函式中添加了除去重複的函式就行了。

class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
        vector<vector<int>> result;
        vector<int> sub;
        sort(nums.begin(),nums.end());
        find(0,nums,sub,result);
        sort(result.begin(),result.end());
        result.erase( unique(result.begin(),result.end()), result.end());
        return result;
    }

    void find(int index, vector<int>& nums, vector<int>& sub, vector<vector<int>>& result){
        if(index<=nums.size())
            result.push_back(sub);
        for(int i=index;i<nums.size();i++){
            sub.push_back(nums[i]);
            find(i+1,nums,sub,result);
            sub.pop_back();
        }
    }
};