其他分享
首页 > 其他分享> > 力扣-78-子集

力扣-78-子集

作者:互联网

看完感觉跟46-全排列很像,仍旧是回溯法,但是怎么做到四选二、四选三呢

官方题解

题解1,迭代枚举

利用二进制位来实现挑选的思路是没有想到的


class Solution {
public:

    // 为什么变量声明这里要写到外面来
    vector<int> t;// 临时数组

    vector<vector<int>> subsets(vector<int>& nums) {
        int n = nums.size();
        vector<vector<int>> ret;

        for (int mask = 0; mask < (1 << n); ++mask) {
            // 1左移n位相当于乘2的n次方
            // 0到2的n次方减一
            t.clear();
            for (int i = 0; i < n; ++i) {
                // 二进制序列的长度
                // 从右至左判断mask每一位是不是1,如果是,就把参数数组中对应的数放进去
                if (mask & (1 << i)) {
                    t.push_back(nums[i]);
                }
            }
            ret.push_back(t);
        }
        return ret;
    }
};

不过这关“迭代”什么事

题解2,递归回溯

class Solution {
public:

    // 这个递归的深度优先算法应该就是标准的回溯了

	vector<int> t;
	vector < vector<int>> ans;

	// 参数是:当前的位置、参数数组
	// 进入DFS前[0,cur-1]位置的状态是确定的
	// 一轮中要确定cur位置的状态
	void dfs(int cur, vector<int>& nums) {
		// 如果当前位置等于数组长度,一个数组的处理就完成了,插到结果数组里去
		if (cur == nums.size()) {
			ans.push_back(t);
			return;
		}
		
		t.push_back(nums[cur]);
		dfs(cur + 1, nums);// 这个相当于是1,这个位置被插进去了的递归
		// 递归
		t.pop_back();
		// 又是这个熟悉的回退操作
		// 这就是所谓的“回溯”了
		dfs(cur + 1, nums);// 而这个相当于是0,这个位置没被插进去的递归
	}

	vector<vector<int>> subsets(vector<int>& nums) {
		dfs(0, nums);
		return ans;
	}
};

评论里还有很多不同的解法,例如:动态规划

标签:cur,递归,nums,dfs,力扣,vector,子集,回溯,78
来源: https://www.cnblogs.com/yaocy/p/16415335.html