78. Subsets 求数组的子数组

难度:【medium】

for ex. 输出的子数组的顺序没有限制。

Input: nums = [1,2,3]
Output:
[
  [3],
  [1],
  [2],
  [1,2,3],
  [1,3],
  [2,3],
  [1,2],
  []
]

主要由两种方法:

方法1:深度优先搜索

    vector> subsets(vector& nums) {
        vector > subs;
        vector sub;
        GetSubs(0, nums, sub, subs);
        return subs;
    }
    
    void GetSubs(int i, vector &nums, vector &sub, vector > &subs) {
        subs.push_back(sub);
        for (int j = i; j < nums.size(); ++j) {
            sub.push_back(nums[j]);
            GetSubs(j + 1, nums, sub, subs);
            sub.pop_back();
        }
    }

方法2:利用bit位

例如:数组 [1, 2, 3],每个元素可以看成001,010,100.  先计算子集合的数量 2^3=8.

从0到7每个值 与 每个元素nums[i]求与运算,如果是true,就插入元素nums[i]。

78. Subsets 求数组的子数组_第1张图片

    vector> subsets(vector& nums) {
        vector > res;
        vector tmp;
        int j = 0;
        int cnt = 1 << nums.size(); // 子集合数量
        while (j < cnt) {
            tmp.clear();
            
            for (int i = 0; i < nums.size(); ++i) {
                if ((1 << i) & j) {
                    tmp.push_back(nums[i]);
                }
            }
            
            res.push_back(tmp);
            ++j;
        }
        
        return res;
    }

 

你可能感兴趣的:(leetcode,array)