组合问题-子集

2023-08-26  本文已影响0人  1哥

题目一
给出一个数组 list = [1,2,3,4,5,6]
求此数组的所有子集合
输出:[1],[1,2],[1,2,3]…
位运算法
2^n 种子集合:每种子集合中每一个bit 代表 数组中index 对应的元素是否在子集合中。
遍历每个2^n 中情况,通过对应的数值,获取对于的元素,然后push_back 到vector 数组中。

    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> result; //开辟二维数组
        int all_set = 1 << nums.size(); //所有的可能数 +1

        for(int i = 0; i < all_set; i++){
            vector<int> item; //开辟一维数组
            for(int j = 0; j < nums.size(); j++){
                if(i & (1 << j)){ //某位置元素是否存在的条件
                    item.push_back(nums[j]);
                }
            }
            result.push_back(item);
        }
        return result;
    }

题目二
给出一个数组 list = [1,2,3,4,5,6]
求此数组的所有子集合中和为6的子集
输出:[6,[2,4],[1,5],[1,2,3]
解题思路:

    vector<vector<int>> subsets(vector<int>& nums, int target ) {
        vector<vector<int>> result; //开辟二维数组
        int all_set = 1 << nums.size(); //所有的可能数 +1

        for(int i = 0; i < all_set; i++){
            vector<int> item; //开辟一维数组
            int sum = 0;
            for(int j = 0; j < nums.size(); j++){
                if(i & (1 << j)){ //某位置元素是否存在的条件
                    item.push_back(nums[j]);
                    sum += nums[j];
                }
            }
            if (sum == target)
              result.push_back(item);
   
        }
        return result;
    }
上一篇下一篇

猜你喜欢

热点阅读