题目

给定一个数组,请返回所有的子集。

输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

原题链接:https://leetcode-cn.com/problems/subsets/

思路

思路1

假定数组长度为 N,首先外层循环,先定好每次选 n 个数,然后回溯法从第 0 个数开始选择即可,直到选满 n 个数为止。为了结果不重复,每次选择第 x 个数后,只从 x + 1 之后的数进行选择。同时,提前做剪枝,如果剩余的数字不够填满子结果了,就提前 break。
每次选 n 个数时,在不考虑剪枝的情况下,回溯的过程中,除了第0层外,第 l 层(下标从1开始)的复杂度为(推导略麻烦)
∏ i = 1 l N − i + 1 i \prod^l_{i=1} \frac{N - i + 1}{i} i=1∏l​iN−i+1​
这个实际上就是
C N l C^l_N CNl​

那么整体选 n 个数的复杂度为
∑ l = 0 n C N l < = 2 N \sum^n_{l=0} C^l_N <= 2^N l=0∑n​CNl​<=2N

再把外循环加进来,整体就是:
∑ n = 0 N ∑ l = 0 n C l = ( 1 + N ) ∗ 2 N + 2 N 2 = N ∗ 2 N 2 + 2 N \sum^N_{n=0}\sum^n_{l=0} C^l = \frac{(1+N)*2^N + 2^N}{2}=\frac{N*2^N}{2}+2^N n=0∑N​l=0∑n​Cl=2(1+N)∗2N+2N​=2N∗2N​+2N

  • 复杂度分析

    • 时间复杂度 O(N * 2^N)。根据上面的复杂度推导。
    • 空间复杂度 O(N) 。回溯最多N层,临时子结果最大为N。

思路2

思路1 当中有一个外循环的过程,也就是先固定数组长度 n 后,再进行回溯。实际上,在进行长度为 N 的回溯过程中,result 子结果会把所有的遍历情况都经历过一次,所以实际上,外循环一次即可。可以再回溯的过程中,把每一个 result 子结果 push 到 results 当中。
不过这种方式就没有剪枝的情况,所以复杂度和思路1 基本上是一样的。具体就不推导了。

选 N 个数时,回溯的过程中,除了第0层外,第 l 层(下标从1开始)的复杂度为
∑ i = 1 N ∑ j = i + 1 N . . . ∑ q = p + 1 N 1 \sum^N_{i=1} \sum^N_{j=i+1}...\sum^N_{q=p+1}1 i=1∑N​j=i+1∑N​...q=p+1∑N​1
其等价于
∏ i = 1 l N − i + 1 i \prod^l_{i=1} \frac{N - i + 1}{i} i=1∏l​iN−i+1​
这个实际上就是
C N l C^l_N CNl​

那么整体选 N 个数的复杂度为
∑ l = 1 N C N l = 2 N − 1 \sum^N_{l=1} C^l_N = 2^N - 1 l=1∑N​CNl​=2N−1

  • 复杂度分析

    • 时间复杂度 O(2^N)。
    • 空间复杂度 O(N) 。

代码

代码1

class Solution {public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> results;vector<int> result;for (int i = 0; i <= nums.size(); i++) {backtrack(results, result, nums, i, 0);}return results;}void backtrack(vector<vector<int>>& results,vector<int>& result, vector<int>& nums, int length, int index) {if (result.size() == length) {results.push_back(result);return;}for (int i = index; i < nums.size(); i++) {if (length - result.size() > nums.size() - index) {break;}result.push_back(nums[i]);backtrack(results, result, nums, length, i + 1);result.pop_back();}}
};

代码2

class Solution {public:vector<vector<int>> subsets(vector<int>& nums) {vector<vector<int>> results;vector<int> result;results.push_back({});backtrack(results, result, nums, nums.size(), 0);return results;}void backtrack(vector<vector<int>>& results,vector<int>& result, vector<int>& nums, int length, int index) {if (result.size() == length) {return;}for (int i = index; i < nums.size(); i++) {result.push_back(nums[i]);     results.push_back(result);backtrack(results, result, nums, length, i + 1);result.pop_back();}}
};

leetcode hot100 之 子集相关推荐

  1. leetcode hot100 梳理

    熟悉一些常用的算法编程题,在应对面试的时候,还是很有帮助的.通过分门别类,将 leetcode hot100 的题目进行梳理,能够加强个人的归纳总结能力,也能让自己在下次复习的时候能够快速的熟悉. 对 ...

  2. LeetCode实战:子集

    题目英文 Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The ...

  3. LeetCode 916. 单词子集(计数)

    1. 题目 我们给出两个单词数组 A 和 B.每个单词都是一串小写字母. 现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集. 例如,"wr ...

  4. leetcode hot100(第一部分) + python(c++)

    1-1.两数之和 思路1:两层for循环 O(n2) class Solution:def twoSum(self, nums, target):res = []for i in range(len( ...

  5. LeetCode hot-100 简单and中等难度,81-90.

    打家劫舍系列题 198. 打家劫舍 难度简单1005收藏分享切换为英文关注反馈 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防 ...

  6. LeetCode hot-100 简单and中等难度,31-40.

    75. 颜色分类 难度中等527收藏分享切换为英文关注反馈 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...

  7. leetcode系列-90.子集 II

    leetcode系列–第90题.子集 II 做此题之前务必先做 第78题题目描述: 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子 ...

  8. leetcode系列-78.子集

    leetcode系列–第78题.子集 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集).解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 输入:num ...

  9. LeetCode Hot100 ---- 滑动窗口专题

    什么是滑动窗口? 其实就是一个队列,比如题中的 abcabcbb找出其中不含有重复字符的 最长子串 的长度,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满 ...

最新文章

  1. am5728 是否支持aarch64_am5728开启uart0接口通讯
  2. Bug关于TP5.1与Swoole使用
  3. SVN打分支及主干合并到分支
  4. Linux如何查找解压文件,linux命令(文件搜索和压缩解压命令)
  5. 剑指offer——面试题56:链表中环的入口
  6. MySQL读写分离详解(二)——MyCAT实战配置
  7. 关于scala中lazy val的几个注意事项
  8. echart制作环形图
  9. Python正则表达式大全
  10. 微信小程序自定义icon
  11. 阿里Sophix 集成
  12. This file should be served over HTTPS. This download has been blocked. computed高级处理
  13. 技术分享 | Hulu视频广告系统中的算法应用
  14. 手机用蓝牙键盘好使吗_手机也可以连接键盘,你知道怎么使用吗?
  15. html5微信拍照后自动刷新,微信内置浏览器物理返回不刷新问题
  16. [可联网]ps4共享屏幕到笔记本
  17. PHP根据汉字转换拼音
  18. Gridea+Coding Page个人网站搭建
  19. 神经网络中epoch、batch、batchsize
  20. 猿团股权投资:开启短平快的全新投融模式

热门文章

  1. 信息网络传播中的服务器标准,信息网络传播权侵权认定标准适用研究
  2. *寒假水105——Reduced ID Numbers
  3. 非侵入式负荷matlab程序,非侵入式负荷分解之BLUED数据集
  4. 调用浏览器局部打印,空白、只有一页问题、火狐兼容
  5. Java基础06-面向对象(1)【类与对象】
  6. 使用Navicat 连接oracle “ORA-03135: Connection Lost Contact”
  7. 逻辑回归Logistics--简述
  8. 计算机专业平均年龄,平均年龄27.07岁 去年23万人才“涌入”深圳
  9. ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化
  10. kylin启动时报错:failed to find metadata store by url kylin_metadata@hbase