1. class Solution {
  2. public:
  3. vector<vector<int>> subsets(vector<int>& nums) {
  4. vector<int> bool_num;
  5. vector<vector<int>> res;
  6. int len=nums.size();
  7.  
  8. if(len==)//特殊情况处理
  9. return res;
  10.  
  11. for(int i=;i<len;i++)//建立一个全零,长度为len的数组,用于模拟二进制加法,其中的1提供索引位置
  12. bool_num.push_back();
  13.  
  14. for(int i=;i<pow(,len);i++)
  15. {
  16. vector<int> item;
  17. for(int j=;j<len;j++)//把不为0的数字推入一个崭新的item
  18. {
  19. if(bool_num[j]!=)
  20. item.push_back(nums[j]);
  21. }
  22. res.push_back(item);
  23.  
  24. bool_num[len-]+=;//模拟二进制加法,目的是遍历K位所有可能的取值
  25. for(int j=len-;j>;j--)
  26. {
  27. if(bool_num[j]==)
  28. {
  29. bool_num[j]=;
  30. bool_num[j-]+=;
  31. }
  32. else
  33. break;
  34. }
  35. }
  36.  
  37. return res;
  38. }
  39. };

分析:

这个算法本质是这样的:

给了一个K位的数组,他的组合应该是从

0:   [NULL]   [NULL]   [NULL]  ........ [NULL]

1:   [num1]   [num2]   [num3]  ........  [numK]

里面组合得到的。

文字描述:对每一个位置上可能选取0/1,分别代表空/实值,这样所有可能组合变为寻找K位二进制所有可能取值。

举例描述:有三位的【1,2,3】数组,我们遍历三位的二进制所有可能,其分别代表

000   []

001   [3]

010   [2]

011   [2,3]

100   [1]

101   [1,3]

110   [1,2]

111   [1,2,3]

然后我就一方面模拟二进制加法遍历K位所有可能,一方面根据当前二进制数索引并添加进res二维数组中。

这个想法不是一开始想到的,我本想按住第一位,用动态规划找后面所有可能,结果阴差阳错的想到的,没想到这么好使,希望我能在关键时候有这运气吧。

leecode第七十八题(子集)的更多相关文章

  1. leecode第一百四十八题(排序链表)

    class Solution { public: void sort_list(ListNode* head1, ListNode* head2,int len)//在原链表上进行排序 { ListN ...

  2. 【leetcode 简单】 第七十八题 Nim游戏

    你和你的朋友,两个人一起玩 Nim游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头. 拿掉最后一块石头的人就是获胜者.你作为先手. 你们是聪明人,每一步都是最优解. 编写一个函数,来判断你 ...

  3. 【20171026早】alert(1) to win - 第六、七、八题

    早上7点起床,又写了一篇小说发在了起点网上,有兴趣的可以看看.点击这里 忙完后,继续练习,刚开始发现自己答题的速度有些慢,可能是因为对于html,javascript知识不是很精通,但是话又说回来,谁 ...

  4. Unity3D研究院之Jenkins的使用(七十八)

    长夜漫漫无心睡眠,来一篇嘿嘿.我相信如果已经用Shell脚本完成IOS和Android打包的朋友一定需要Jenkins 怎么才能让策划打包ipa和apk?怎么才能彻底省去程序的时间,只要在同一局域网内 ...

  5. (七十八)使用第三方框架INTULocationManager实现定位

    前面(第七十五.七十六篇)讲述了如何通过CoreLocation获取位置,授权.获取等相当复杂,如果借助于第三方框架,可以简单的实现授权与定位. 首先在GitHub中搜索LocationManager ...

  6. leecode第八十八题(合并两个有序数组)

    class Solution { public: void merge(vector<int>& nums1, int m, vector<int>& nums ...

  7. leecode第七十题(爬楼梯)

    class Solution { public: int climbStairs(int n) { vector<unsigned long long> num;//斐波那契数列 num. ...

  8. leecode第二百三十八题(除自身以外数组的乘积)

    class Solution { public: vector<int> productExceptSelf(vector<int>& nums) { int len= ...

  9. leecode第四十六题(全排列)

    class Solution { public: vector<vector<int>> permute(vector<int>& nums) { int ...

随机推荐

  1. URL的解析,C语言实现

    源: URL的解析,C语言实现 c语言实现urlencode和decode

  2. lnmp重置密码

    wget http://soft.vpser.NET/lnmp/ext/reset_mysql_root_password.sh;sh reset_mysql_root_password.sh

  3. Linux 搭建安装Maven环境

    1.前提条件: 1)下载并安装好JDK .在终端输入命令“java -version”,如果出现类似如下信息说明JDK安装成功. $ java -version java version " ...

  4. Vue小案例 之 商品管理------删除商品与提示

    实现删除商品功能 根据索引来进行删除商品: 实现删除商品的HTML: <!--显示表格--> <div class="table-warp"> <di ...

  5. Apache2.4反向代理设置

    一.配置方向代理 1,放开虚拟主机(反向代理)模块,在httpd.conf中把下三行配置放开: LoadModule proxy_module modules/mod_proxy.so LoadMod ...

  6. oracle 11g enq: JI – contention等待事件

    最近使用物化视图同步的环境在大量刷新的时候频繁出现enq: JI – contention等待事件,经查: JI enqueue is acquired in exclusive mode on th ...

  7. 【题解】Luogu SP8791 DYNALCA - Dynamic LCA

    原题传送门 这题用Link-Cut-Tree解决,Link-Cut-Tree详解 这道题的难点就在如何求LCA: 我们珂以先对其中一个点进行access操作,然后对另一个点进行access操作,因为L ...

  8. 我仅使用到的dd if

    备份一个分区 分区 镜像名 读写块大小 dd if=/dev/sdb of=/diskone.img bs=512 注:可以为了提升I/O把bs设为较高的数值例:bs=1024k 挂载一个分区 mou ...

  9. JS实现对数器

    对数器的概念和使用 对数器一般用于验证你写的算法是否正确,因为自己写的测试用例可能写的考虑不够全面. 0.有一个你想测试的方法a 1.实现一个绝对正确但是时间复杂度不好的方法b 2.实现一个随机样本产 ...

  10. 【python002-设计小游戏】

    用python设计第一个游戏 一.运行idle的快捷方式:F5 二.首先设计一款小游戏: print('-------开启python学习之旅--------')temp = input(" ...