1. 程式人生 > >lintcode:子集 & 帶重復元素的子集

lintcode:子集 & 帶重復元素的子集

rac push_back subset style () col numbers 篩選 with

地址:

http://lintcode.com/zh-cn/problem/subsets/

http://lintcode.com/zh-cn/problem/subsets-ii/

子集

其實就是一顆子集樹

class Solution {
public:
    vector<vector<int>> res;
    vector<int> judge;
    int len;
    /*
     * @param nums: A set of numbers
     * @return: A list of lists
     */
    vector<vector<int
>> subsets(vector<int> &nums) { // write your code here len = nums.size(); for(int i=0;i<len;i++){ judge.push_back(0); } backtrack(0,nums); return res; } void display(vector<int> &nums){ vector<int
> cur; for(int i=0;i<len;i++){ if(judge[i]==1){ cur.push_back(nums[i]); } } res.push_back(cur); } void backtrack(int t,vector<int> &nums){ if(t >= len){ display(nums); return
; } for(int i=0;i<=1;i++){ judge[t] = i; backtrack(t+1,nums); } } };

帶重復元素的子集

篩選一下分支,排序數組,然後相同的元素只能出現1,...,0...或者全1、全0的形式,也就是不能有101這樣的情況,

class Solution {
public:
    vector<vector<int>> res;
    vector<int> judge;
    int len;
    /*
     * @param nums: A set of numbers.
     * @return: A list of lists. All valid subsets.
     */
    vector<vector<int>> subsetsWithDup(vector<int> &nums) {
        // write your code here
        len = nums.size();
        sort(nums.begin(),nums.end());
        for(int i=0;i<len;i++){
            judge.push_back(0);
        }
        backtrack(0,nums);
        return res;
    }

   void display(vector<int> &nums){
        vector<int> cur;
        for(int i=0;i<len;i++){
            if(judge[i]==1){
                cur.push_back(nums[i]);
            }
        }
        res.push_back(cur);
    }
    
    bool isOk(int t,vector<int> &nums){
        int count=1;
        for(int i=0;i<t;i++){
            if(nums[i]==nums[i+1]){
                if(judge[i]==0){
                    count = 0;
                } else {
                    count = 1;
                }
                
                if(!count && judge[i+1] ){
                    return false;
                }
            } else {
                count=1;
            }
        }
        return true;
    }
    
    void backtrack(int t,vector<int> &nums){
        if(t >= len){
            display(nums);
            return;
        }
        
        for(int i=0;i<=1;i++){
            judge[t] = i;
            if(isOk(t,nums)){
                backtrack(t+1,nums);
            }
        }
    }
    
};

lintcode:子集 & 帶重復元素的子集