LeetCode78:Subsets

来源:互联网 发布:阿里巴巴数据工具 编辑:程序博客网 时间:2024/06/01 07:21

Given a set of distinct integers, nums, return all possible subsets.

Note:
Elements in a subset must be in non-descending order.
The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3], a solution is:

[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]

这道题可以使用两种方法求解,一是使用位操作,另外是使用深度优先搜索和回溯,但是我只想出了位操作,深度优先的方法是看了Discuss后想出来的。

解法一:位操作

对于数组[1,2,3],可以用一个下标0和1表示是否选择该数字,0表示未选择,1表示选中,那么每一组3个0和1的组合表示一种选择,3位共有8种选择,分别是:
000 对应[]
001 对应[3]
010 对应[2]
011 对应[2,3]
100 …
101
110
111
那么上面为1的位表示数组中该位被选中。
那么只需要遍历0到1<< length中的数,判断每一个数中有那几位为1,为1的那几位即会构成一个子集中的一个元素。

runtime:8ms

class Solution {public:    vector<vector<int>> subsets(vector<int>& nums) {        int length=nums.size();        sort(nums.begin(),nums.end());        vector<vector<int> > result;        for(int i=0;i<1<<length;i++)        {            vector<int> tmp;            //计算i中有那几位为1            for(int j=0;j<length;j++)            {                //判断i中第j位是否为1                if(i&1<<j)                {                    tmp.push_back(nums[j]);                }            }            result.push_back(tmp);        }        return result;    }};

解法二:回溯法

还可以使用深度优先搜索来遍历数组,采用回溯法来剔除元素。使用一个变量来记录路径,每遍历到一个元素即表示找到一条路径,将其加入子集中。
对于数组[1,2,3]
从1开始递归查询2,3,对于2,继续向下搜索,搜索完后将2删除。
runtime:8ms

class Solution {public:        //使用深度优先的回溯法     vector<vector<int>> subsets(vector<int>& nums) {         vector<vector<int>> result;         vector<int> path;         sort(nums.begin(),nums.end());         result.push_back(path);         dfs(nums,0,path,result);         return result;     }     void dfs(vector<int>& nums,int pos,vector<int> & path,vector<vector<int>> & result)     {            if(pos==nums.size())                return;            for(int i=pos;i<nums.size();i++)            {                path.push_back(nums[i]);                result.push_back(path);                dfs(nums,i+1,path,result);                path.pop_back();            }     }};
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 邮政网银密码忘了怎么办 12306新注册待核验怎么办 建行网银盾密码忘了怎么办 建行网银登陆密码忘了怎么办 建行网银密码忘了怎么办 建行手机网银密码忘了怎么办 移动宽带账号密码忘了怎么办 移动宽带忘记账号密码怎么办 宽带账号密码忘了怎么办 不知道宽带账号密码怎么办 宽带的账号密码忘记了怎么办 wifi登录名忘记了怎么办 苹果手机微信图纸打不开怎么办 手机qq邮箱文件打不开怎么办 12360忘记用户名和密码怎么办 刚开店铺没生意怎么办 淘宝账户不符合注销条件怎么办 网易邮箱登录密码忘记了怎么办 q号密码忘记了怎么办 志愿者注册忘记密码和用户名怎么办 w10电脑语言栏不见了怎么办 w10美式键盘没了怎么办 xp电脑开机密码忘记了怎么办 电脑开机密码到期忘记改怎么办 电脑账户数据库密码忘了怎么办 微信不能拍摄了怎么办 华硕笔记本用户名密码忘了怎么办 学信网登录密码用户名搞忘怎么办 电脑密码输入错误会被锁怎么办 电脑被锁机软件设了密码怎么办 电脑密码被锁了怎么办 电脑xp密码忘了怎么办 三星账户账号密码忘了怎么办 三星账户密码忘记了怎么办 w7账号被禁用了怎么办 笔记本用户名密码忘记了怎么办 笔记本忘记用户名和密码怎么办 苹果手机忘记用户名和密码怎么办 w10电脑忘了密码怎么办 联想台式电脑密码忘记了怎么办 新电脑用一会就很烫怎么办