当前位置:网站首页>LeetCode高频题78. 子集,返回该数组所有可能的子集(幂集),生成所有的子序列
LeetCode高频题78. 子集,返回该数组所有可能的子集(幂集),生成所有的子序列
2022-08-06 13:05:00 【冰露可乐】
LeetCode高频题78. 子集,返回该数组所有可能的子集(幂集),生成所有的子序列
提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目互联网大厂们在公司养了一大批ACM竞赛的大佬们,吃完饭就是设计考题,然后去考应聘人员,你要做的就是学基础树结构与算法,然后打通任督二脉,以应对波云诡谲的大厂笔试面试题!你要是不扎实学习数据结构与算法,好好动手手撕代码,锻炼解题能力,你可能会在笔试面试过程中,连题目都看不懂!比如华为,字节啥的,足够让你读不懂题
基础知识:
【1】LeetCode高频题46. 全排列
题目
给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
一、审题
示例 1:
输入:nums = [1,2,3]
输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
输入:nums = [0]
输出:[[],[0]]
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/subsets
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这不就是暴力枚举每个位置要还是不要整出来的所有情况吗?

就是暴力递归就行了
定义一个函数:
f(int[] arr, int i, LinkedList<Integer> tmp, List<List<Integer>> ans)
啥含义呢?
来到arr的i位置,咱们决定i那个数字要?还是不要?
要的话加入tmp暂存,然后考虑i+1位置
当i到arr的末尾N位置,一个路径已经决定好了,把tmp放入结果ans中
然后清除现场,tmp把刚刚加入的i位置那个数字扔掉,继续考虑别的情况
啥叫清楚现场呢?
就是下面左边的3,tmp=123,算一种情况,你要考虑3不要的情况
进f之前,自然要把3吐出去,这样tmp才能走右边的路,因为我们一直重复用一个tmp,所以自然一种情况考虑完,要吐掉,然后考虑别的情况
这已经是非常简单的暴力递归了
之前咱们讲全排列时,已经说过了,这个比全排列简单
okay,咱们手撕本题代码,超级简单的
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> ans = new ArrayList<>();
LinkedList<Integer> tmp = new LinkedList<>();//中途放tmp
f(nums, 0, tmp, ans);//从i=0--N收集答案
return ans;
}
// 这不就是暴力枚举每个位置要还是不要整出来的所有情况吗?
//从左往右来到i位置,决定要还是不要?
//来到arr的i位置,中途决定好的放tmp
//当i=N位置就把东西放ans中收集好
public static void f(int[] arr, int i, LinkedList<Integer> tmp, List<List<Integer>> ans){
if (i == arr.length){
ans.add(new ArrayList<>(tmp));//中途可能需要恢复现场的
return;
}
//2种,要还是不要
f(arr, i + 1, tmp, ans);//不要
tmp.addLast(arr[i]);
f(arr, i + 1, tmp, ans);//要
tmp.removeLast();//恢复现场,考虑别的情况
}
测试:
public static void test(){
int[] arr = {
1,2,3};
Solution solution = new Solution();
List<List<Integer>> ans = solution.subsets(arr);
for(List<Integer> lists : ans){
for(Integer i:lists) System.out.print(i +" ");
System.out.println();
}
}
public static void main(String[] args) {
test();
}
--空
3
2
2 3
1
1 3
1 2
1 2 3
LeetCode测试:

本题暴力归队就是最好的方案
因为每一个情况都要遍历,所以没有优化的空间
done!
总结
提示:重要经验:
1)全排列和这种组合问题,老掉牙的暴力递归,恢复现场,多次说过了
3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。
边栏推荐
- 对话小牛电动CEO李彦:我们要做有独特价值主张的产品
- 在数据中查找信号
- 链表 | 反转链表 | leecode刷题
- PHP+HTML+MySQL实现登录报错
- [极客大挑战 2019]BabySQL 1
- SQL图解面试题:如何实现精细化运营?(具体且精确的全过程详细讲解)
- The "Pytorch Common Functions Manual" compiled by Dr. Harbin Institute of Technology for half a year is open for download!Contains more than 200 functions! …
- 哈工大博士历时半年整理的《Pytorch常用函数手册》开放下载!内含200余个函数!...
- 生产级Redis 高并发分布式锁实战2:缓存架构设计问题优化
- Logstash、Filebeat安装与数据同步
猜你喜欢

Wechat video account live broadcast room involving pornography

哈工大博士历时半年整理的《Pytorch常用函数手册》开放下载!内含200余个函数!...

软件设计原则

Wang Shuang Assembly Language Chapter 6: Programs Containing Multiple Segments

【TypeScript 必学必会】 关于TypeScript你必须知道的一切

SQL图解面试题:如何找到喜欢的电影?(表连接,语句执行顺序、模糊查询)
![[Geek Challenge 2019] PHP 1](/img/86/a65393768cd9cf129132fcd374dcd2.png)
[Geek Challenge 2019] PHP 1

AlexNet—论文分析及复现

哈希表 | 基础知识总结

【 TypeScript will learn will be 】 you must know all about TypeScript
随机推荐
NAS 硬件采购配置记录
生产级Redis 高并发分布式锁实战2:缓存架构设计问题优化
muduo网络库的使用
解决创建虚拟机时No DEFAULT or UI configuration directive found问题
Security on the sixth day practice after class
40度高温,如何通过SOLIDWORKS找到室内最凉快的地方?
Security on the seventh day to practice after class
How to recover EOS keys after being stolen?
SQL图解面试题:如何找到破产玩家?(交叉连接)
苏秋贵:外贸企业如何做到以市场为导向
具体的多路分发器:EPollPoller
EOS密钥被盗后如何恢复?
Web网页端IM产品RainbowChat-Web的v4.1版已发布
AlexNet—论文分析及复现
Kubernetes 集群 Ingress 网关
事件
Rtklib-rinex文件的读取(rinex.c)-序言
LeetCode 897. Searching Trees in Ascending Order
高性能云原生数据对象存储MinIO实战-上
密码学系列之:PEM和PKCS7,PKCS8,PKCS12