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);
            }
        }
    }

};

原文地址:https://www.cnblogs.com/rimochiko/p/8440771.html

时间: 2024-08-29 01:15:15

lintcode:子集 & 带重复元素的子集的相关文章

lintcode 中等题:subsets II 带重复元素的子集

题目 带重复元素的子集 给定一个可能具有重复数字的列表,返回其所有可能的子集 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 注意 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 挑战 你可以同时用递归与非递归的方式解决么? 解题 一个很简单的想法就是在上一题目中增加判断是否已经存在某个子集 class Solution: """ @param S: A

带重复元素的子集

给定一个可能具有重复数字的列表,返回其所有可能的子集 注意事项 子集中的每个元素都是非降序的 两个子集间的顺序是无关紧要的 解集中不能包含重复子集 样例 如果 S = [1,2,2],一个可能的答案为: [ [2], [1], [1,2,2], [2,2], [1,2], [] ] 思路: 第一种做法,递归加回溯.同一层中只要不选相同的数字,那么就不会出现重复的情况.(看似很有道理,可是证明它的正确性貌似没有这么容易,如何想到这种策略的呢?) 第二种做法,二进制加速(厉害了),利用hashset

九章算法面试题54 带重复元素的全排列

九章算法官网-原文网址 http://www.jiuzhang.com/problem/54/ 题目 给定一个带重复元素的整数集合,求出这个集合中所有元素的全排列.对于集合[1,1,2],其本质不同的全排列有三个,分别为: [1,1,2] [1,2,1] [2,1,1] 在线测试本题 http://lintcode.com/problem/unique-permutations/ 解答 首先做这个题目之前,要先会不带重复元素的全排列. 程序参考:http://www.ninechapter.co

[LintCode] 带重复元素的排列

递归实现: 1 class Solution { 2 public: 3 /** 4 * @param nums: A list of integers. 5 * @return: A list of unique permutations. 6 */ 7 vector<vector<int> > permuteUnique(vector<int> &nums) { 8 // write your code here 9 sort(nums.begin(), n

从n个元素中选择k个的所有组合(包含重复元素)

LeetCode:Combinations这篇博客中给出了不包含重复元素求组合的5种解法.我们在这些解法的基础上修改以支持包含重复元素的情况.对于这种情况,首先肯定要对数组排序,以下不再强调 修改算法1:按照求包含重复元素集合子集的方法LeetCode:Subsets II算法1的解释,我们知道:若当前处理的元素如果在前面出现过m次,那么只有当前组合中包含m个该元素时,才把当前元素加入组合 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

[LeetCode系列]子集枚举问题[有重复元素]

给定一组数(未排序, 可能有重复元素), 求出所有可能的组合. 算法和无重复元素的相似. 唯一需要注意的是, 如果当前的数字和之前的相同, 算法就只会在结尾数字是此数字的组合后加上此数字. 比如现在是[[] [1] [1 2] [2]], 当前数字是2, 就只会增加[1 2 2] [2 2] 代码: 1 class Solution { 2 public: 3 vector<vector<int> > subsetsWithDup(vector<int> &S)

三元环:在数集中求有多少个三元子集中的元素两两互质

2.14在杭二参加集训,校园好美!!!QAQ 杜教在下午为大家做了上午三题的讲解和一些CF杂题的选讲,其中有在图上求所有三元环的算法.这个算法不是很复杂,但还是蛮有趣的啦QWQ 我们已有一些整数,记作a1,a2,...,an.我们希望求出这些数中有多个含有三个元素的子集满足题目的条件,即{ai,aj,ak}中(ai,aj)=1且(ai,ak)=1且(aj,ak)=1. 第一步,建图.将a1,a2,...an分别作为编号为1,2,...,n的点处理,且如果ai和aj互质,那么结点i和结点j之间建立

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

题目描述: 给定一个排序链表,删除所有重复的元素每个元素只留下一个. 您在真实的面试中是否遇到过这个题? Yes 样例 给出 1->1->2->null,返回 1->2->null 给出 1->1->2->3->3->null,返回 1->2->3->null 标签 链表 题目分析: 给定一个排序链表,删除所有重复的元素每个元素只留下一个. 源码: """ Definition of ListNod

可查找重复元素的二分查找算法

可查找重复元素的二分查找算法 二分查找算法思想:又称为 折半查找,二分查找适合对已经排序好的数据集合进行查找.假设有一升序的数据集合,先找出升序集合中最中间的元素,将数据集合划分为两个子集,将最中间的元素和关键字key进行比较,如果等于key则返回:如果大于关键字key,则在前一个数据集合中查找:否则在后一个子集中查找,直到找到为止:如果没找到则返回-1. 思路: 1.先定义两个下标 , left = 0 , right = arr.length -1; 2.因为我们也不知道要循环多少次,定义一