78 子集

78 子集

解法一.位运算

2位数有4种子集 null,1,2,12

3位数有8种子集

1<<2==4 1<<3==8

0到7的二进制表示依次为

0000
0001
0010
0011
0100
0101
0110
0111

将数组整体看成一个数,将数组中的每一位看成一个1,即可得到全排列

0000    null
0001     1
0010     2
0011     1 2
0100     3
0101     1 3
0110     2 3
0111     1 2 3

代码如下


class Solution {
public:
    vector<vector<int>> subsets(vector<int> &nums) {
        vector<vector<int>> res;
        int n = nums.size();
        cout << (1 << n) << endl;
        for (int i = 0; i < (1 << n); i++) {
            vector<int> temp;
            for (int j = 0; j < n; j++) {
                cout << (i >> j) << "  " << ((i >> j) & 1) << endl;
                if (i >> j & 1)
                    temp.push_back(nums[j]);
            }
            res.push_back(temp);
        }
        return res;
    }
};

解法二.回溯

class Solution {
public:
    vector<vector<int>> save;

    void set(int i, const vector<int> &num, int val, vector<int> vec) {
        vec.push_back(val);
        save.push_back(vec);
        if (i == num.size())
            return;
        for (int x = i; x < num.size(); ++x)
            set(x + 1, num, num[x], vec);
    }

    vector<vector<int>> subsets(vector<int> &nums) {
        if (nums.empty())
            return save;
        for (int x = 0; x < nums.size(); ++x)
            set(x + 1, nums, nums[x], {});
        save.push_back({});
        return save;
    }
};

猜你喜欢

转载自www.cnblogs.com/INnoVationv2/p/10276857.html