lintcode:子集 & 带重复元素的子集

Posted 年糕君の勉强笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了lintcode:子集 & 带重复元素的子集相关的知识,希望对你有一定的参考价值。

地址:

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:子集 & 带重复元素的子集的主要内容,如果未能解决你的问题,请参考以下文章

lintcode 中等题:longest substring without repeating characters 最长无重复字符的子串

由LintCode问题子集出发,浅析ArrayList的拷贝问题

lintcode17/18Subset, SubsetII

Lintcode17 Subsets solution 题解

LintCode Python 简单级题目 112.删除链表中的重复元素

Jquery如何选取元素及其所有子元素?