news 2026/5/25 21:37:15

056子集

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
056子集

子集

题目链接:https://leetcode.cn/problems/subsets/description/?envType=study-plan-v2&envId=top-100-liked

我的解答:

public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); List<Integer> output = new ArrayList<>(); backtrack(nums, output, 0, nums.length, ans); return ans; } public void backtrack(int[] nums, List<Integer> output, int cur, int n, List<List<Integer>> ans){ if(cur == n){ ans.add(new ArrayList<>(output)); return; } //不选取当前位置的元素 backtrack(nums, output, cur+1, n, ans); //选取当前位置的元素 output.add(nums[cur]); backtrack(nums, output, cur+1, n, ans); //回溯 output.remove(output.size()-1); }

分析:代码的时间复杂度为O(n*2^n),空间复杂度为O(n)。解题思路:对于nums数组的每一个元素只有两种情况(选取和不选取),递归+回溯即可简单解决此问题。

看了官方题解后的解答:

//方法一:迭代法实现子集枚举 //时间复杂度:O(n*2^n) //空间复杂度:O(1) public List<List<Integer>> subsets(int[] nums) { int n = nums.length; List<List<Integer>> ans = new ArrayList<>(); int max = 1 << n;//计算2^n for(int i=0; i<max; i++){ ans.add(new ArrayList<>()); for(int j=0; j<n; j++){ if(((1 << j) & i) != 0){ ans.get(i).add(nums[j]); } } } return ans; } //方法二:递归法实现子集枚举(方法二与我的解答基本一致) //时间复杂度:O(n*2^n),一共2^n个状态,每种状态需要 O(n) 的时间来构造子集。 //空间复杂度:O(n) public List<List<Integer>> subsets(int[] nums) { List<List<Integer>> ans = new ArrayList<>(); List<Integer> output = new ArrayList<>(); backtrack(nums, output, 0, ans); return ans; } public void backtrack(int[] nums, List<Integer> output, int cur, List<List<Integer>> ans){ if(cur == nums.length){ ans.add(new ArrayList<>(output)); return; } //不选取当前位置的元素 backtrack(nums, output, cur+1, ans); //选取当前位置的元素 output.add(nums[cur]); backtrack(nums, output, cur+1, ans); //回溯 output.remove(output.size()-1); }

分析:

​ 1、方法一的解题思路:对于一个长度为n的集合,它的子集一共有2^n 种可能,对于数组每一个位置上的元素,只有两种状态,分别为在子集中和不在子集中,我们让0代表不在子集中,让1代表在子集中,这样对于任意一个子集,都可以用一串长度为n的01序列来表示,根据这个发现,我们只需列举0到2^n-1这些数字,他们对应的二进制就可以代表一个子集,我们只需根据二进制每一位是0还是1来决定nums数组在此位置的元素要不要加入当前子集即可。

​ 2、方法二的解题思路与我的解答一致。

总结

  • 本题可采用迭代和递归两种方法解题。
  • 迭代法根据每个位置上的元素只有两种状态将子串与二进制序列联系起来。
  • 注意递归方法的时间复杂度计算。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 21:36:44

告别手动测试!VtestStudio结合CAPL脚本实现自动化测试的保姆级教程

从手动到自动化&#xff1a;VtestStudio与CAPL脚本构建车载测试新范式在车载电子系统日益复杂的今天&#xff0c;传统手动测试已难以满足CAN总线等车载网络的高效验证需求。VtestStudio作为Vector公司推出的专业测试平台&#xff0c;结合CAPL脚本语言的强大功能&#xff0c;为工…

作者头像 李华
网站建设 2026/5/25 21:32:24

基于LPC800 MCU的工业定时器改造:从NE555到高精度数字控制

1. 项目概述&#xff1a;从模拟到数字&#xff0c;为老设备注入精准“心跳”手头有个老款的UV曝光设备&#xff0c;用来做电路板或者一些光固化工艺的朋友应该不陌生。这设备什么都好&#xff0c;就是那个控制曝光时间的定时器太“复古”了——用的还是经典的NE555芯片加电位器…

作者头像 李华
网站建设 2026/5/25 21:31:06

BiliRoamingX:彻底解决B站体验限制的完整增强方案

BiliRoamingX&#xff1a;彻底解决B站体验限制的完整增强方案 【免费下载链接】BiliRoamingX-integrations BiliRoamingX integrations and patches powered by ReVanced. 项目地址: https://gitcode.com/gh_mirrors/bi/BiliRoamingX-integrations 你是否曾为B站的内容区…

作者头像 李华
网站建设 2026/5/25 21:29:07

Sweet32漏洞深度解析:3DES-CBC在TLS中的生日攻击与实战禁用指南

1. Sweet32到底是什么&#xff1f;一个被低估了十年的“慢刀子”漏洞很多人看到CVE-2016-2183这个编号&#xff0c;第一反应是“2016年的老漏洞&#xff0c;早该修完了”。我去年在给一家省级政务云做渗透复测时也这么想——直到用Wireshark抓到一段看似正常的HTTPS流量&#x…

作者头像 李华
网站建设 2026/5/25 21:24:59

如何在浏览器中一键解密所有加密音乐文件:Unlock-Music完全指南

如何在浏览器中一键解密所有加密音乐文件&#xff1a;Unlock-Music完全指南 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地…

作者头像 李华
网站建设 2026/5/25 21:24:04

一招搞定:黑群晖DSM918与Linux通用硬盘扩容命令(parted resizepart详解)

跨平台硬盘扩容实战&#xff1a;parted命令在群晖与Linux中的通用技巧当你面对一台存储空间告急的群晖NAS或Linux服务器时&#xff0c;是否曾为扩容操作而犹豫不决&#xff1f;实际上&#xff0c;无论是黑群晖DSM918还是标准Linux发行版&#xff0c;底层都共享着相同的磁盘管理…

作者头像 李华