LeetCode 78 Subsets(递归、二进制位)

题目链接:点击这里
在这里插入图片描述
递归:

class Solution {
public:

    void dfs(int idx, vector<int>& nums, vector<int>& tmp, vector<vector<int>>& ans)
    {
        if(idx>=nums.size())
        {
            ans.push_back(tmp);
            return;
        }
        tmp.push_back(nums[idx]);
        dfs(idx+1, nums, tmp, ans);
        tmp.pop_back();
        dfs(idx+1, nums, tmp, ans);
    }

    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;    //记录最终结果
        vector<int> tmp;    //记录中间结果
        dfs(0, nums, tmp, ans);
        return ans;
    }
};

二进制位角度:

一个包含 n n 个元素的集合 { a 0 , a 1 , a 2 , a 3 , . . . , a n 1 } \left\{a_0, a_1, a_2, a_3, ..., a_{n-1}\right\} ,它的子集有 {   } \left\{\ \right\} { a 0 } \left\{a_0\right\} { a 1 } \left\{a_1\right\} { a 2 } \left\{a_2\right\} , …, { a 0 , a 1 , a 2 } \left\{a_0, a_1, a_2\right\} , … , { a 0 , a 1 , a 2 , a 3 , . . . , a n 1 } \left\{a_0, a_1, a_2, a_3, ..., a_{n-1}\right\} 2 n 2^n 个。

例如 n = 3 n = 3 的集合 { a 0 , a 1 , a 2 } \left\{a_0, a_1, a_2\right\} ,它的子集和二进制数的对应关系是:

  • 每个子集对应一个二进制数;
  • 这个二进制数中的每个 1 1 ,都对应了这个子集中的某个元素。
  • 子集的数量是 2 n 2^n 个,因为所有二进制数的总个数是 2 n 2^n

代码中可能用到的位运算如下:

  • 1<<n 1 2 n 1 * 2^n
  • i&(1<<j) 即判断 i i 的第 j j 位是否为 1 1

可以通过处理二进制中的 1 1 来打印所有的子集:

#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;

void print_subset(int n)
{
	//i:0~2^n, 每个i的二进制数对应一个子集,一次打印一个子集,最后得到所有子集
	for(int i = 0; i < (1<<n); i++)
	{ 
		for(int j = 0; j < n; j++)
			if(i&(1<<j))	//判断i的第j位是否为1 
				cout<<j<<" ";
		cout<<endl;
	}
}

int main()
{
	int n;
	cin>>n;
	print_subset(n);
	return 0;
}

AC代码如下:

class Solution {
public:
    void print_subset(vector<int>& nums, vector<vector<int>>& ans)
    {
        int n = nums.size();
        //i: 0 ~ 2^n, 每个i的二进制数对应一个子集,一次打印一个子集,最后得到所有子集
        for(int i = 0; i < (1<<n); i++)
        {
            vector<int> tmp;
            for(int j = 0; j < n; j++)
                if(i&(1<<j))	//判断i的第j位是否为1 
                    tmp.push_back(nums[j]);
            ans.push_back(tmp);
        }
    }
    vector<vector<int>> subsets(vector<int>& nums) {
        vector<vector<int>> ans;
        print_subset(nums, ans);
        return ans;
    }
};
发布了701 篇原创文章 · 获赞 104 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/qq_42815188/article/details/104089412