leetcode hot100 之 子集
题目
给定一个数组,请返回所有的子集。
输入: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∏liN−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∑nCNl<=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∑Nl=0∑nCl=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∑Nj=i+1∑N...q=p+1∑N1
其等价于
∏ i = 1 l N − i + 1 i \prod^l_{i=1} \frac{N - i + 1}{i} i=1∏liN−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∑NCNl=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 之 子集相关推荐
- leetcode hot100 梳理
熟悉一些常用的算法编程题,在应对面试的时候,还是很有帮助的.通过分门别类,将 leetcode hot100 的题目进行梳理,能够加强个人的归纳总结能力,也能让自己在下次复习的时候能够快速的熟悉. 对 ...
- LeetCode实战:子集
题目英文 Given a set of distinct integers, nums, return all possible subsets (the power set). Note: The ...
- LeetCode 916. 单词子集(计数)
1. 题目 我们给出两个单词数组 A 和 B.每个单词都是一串小写字母. 现在,如果 b 中的每个字母都出现在 a 中,包括重复出现的字母,那么称单词 b 是单词 a 的子集. 例如,"wr ...
- leetcode hot100(第一部分) + python(c++)
1-1.两数之和 思路1:两层for循环 O(n2) class Solution:def twoSum(self, nums, target):res = []for i in range(len( ...
- LeetCode hot-100 简单and中等难度,81-90.
打家劫舍系列题 198. 打家劫舍 难度简单1005收藏分享切换为英文关注反馈 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防 ...
- LeetCode hot-100 简单and中等难度,31-40.
75. 颜色分类 难度中等527收藏分享切换为英文关注反馈 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中, ...
- leetcode系列-90.子集 II
leetcode系列–第90题.子集 II 做此题之前务必先做 第78题题目描述: 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子 ...
- leetcode系列-78.子集
leetcode系列–第78题.子集 给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集).解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 输入:num ...
- LeetCode Hot100 ---- 滑动窗口专题
什么是滑动窗口? 其实就是一个队列,比如题中的 abcabcbb找出其中不含有重复字符的 最长子串 的长度,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满 ...
最新文章
- am5728 是否支持aarch64_am5728开启uart0接口通讯
- Bug关于TP5.1与Swoole使用
- SVN打分支及主干合并到分支
- Linux如何查找解压文件,linux命令(文件搜索和压缩解压命令)
- 剑指offer——面试题56:链表中环的入口
- MySQL读写分离详解(二)——MyCAT实战配置
- 关于scala中lazy val的几个注意事项
- echart制作环形图
- Python正则表达式大全
- 微信小程序自定义icon
- 阿里Sophix 集成
- This file should be served over HTTPS. This download has been blocked. computed高级处理
- 技术分享 | Hulu视频广告系统中的算法应用
- 手机用蓝牙键盘好使吗_手机也可以连接键盘,你知道怎么使用吗?
- html5微信拍照后自动刷新,微信内置浏览器物理返回不刷新问题
- [可联网]ps4共享屏幕到笔记本
- PHP根据汉字转换拼音
- Gridea+Coding Page个人网站搭建
- 神经网络中epoch、batch、batchsize
- 猿团股权投资:开启短平快的全新投融模式
热门文章
- 信息网络传播中的服务器标准,信息网络传播权侵权认定标准适用研究
- *寒假水105——Reduced ID Numbers
- 非侵入式负荷matlab程序,非侵入式负荷分解之BLUED数据集
- 调用浏览器局部打印,空白、只有一页问题、火狐兼容
- Java基础06-面向对象(1)【类与对象】
- 使用Navicat 连接oracle “ORA-03135: Connection Lost Contact”
- 逻辑回归Logistics--简述
- 计算机专业平均年龄,平均年龄27.07岁 去年23万人才“涌入”深圳
- ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化
- kylin启动时报错:failed to find metadata store by url kylin_metadata@hbase