题目链接

  • 思路一:回溯

    • 对于这种可以分为若干步,每一步有很多选择的题目非常适合用回溯法来做。
    • 具体的方式为写一个helper函数,参数为当前的结果集合subset,当前选择的数字的索引index。
    • 首先需要判断,如果index和nums.length相等时说明所有的元素都考虑过了,那么就把现在的结果集合加入到result中(注意要new一个新的List)
    • 当index < nums.length时说明此时正在选择某一个元素。对于这个元素我们可以不选择它,那么就直接调用helper函数,那么此时选择的是下一个元素,所以参数是index+1。当然我们也可以选择这个元素,那么就先把数字加入到subset中,然后再调用helper函数,最后从递归状态树中返回父节点时要清除当前状态,所以最后还要把该数字从列表中删除
      class Solution {List<List<Integer>> result;int[] nums;public List<List<Integer>> subsets(int[] nums) {result = new ArrayList<>();this.nums = nums;helper(new ArrayList<Integer>(), 0);return result;}private void helper(List<Integer> subset, int index) {if (index == nums.length)result.add(new LinkedList<>(subset));else {// 不选择这个数helper(subset, index + 1);// 选择这个数subset.add(nums[index]);helper(subset, index + 1);subset.remove(subset.size() - 1);}}}
    
  • 思路二:二进制枚举

    • 以三个数字为例,子集共有2^3个。对于每个数字的选择与否我们可以看作二进制的某一位是1还是0.因此长度为n的数组对应的状态数目可以用n位二进制数来代表。具体得到某个数字后,我们分别得到每一位的值,判断是1还是0,如果是1就把对应的数字加入当前的subset
      class Solution {public List<List<Integer>> subsets(int[] nums) {List<List<Integer>> result = new ArrayList<>();for (int i = 0; i < (1 << nums.length); i++) {List<Integer> subset = new ArrayList<>();for (int j = 0; j < nums.length; j++) {if (1 == ((i >> j) & 1))subset.add(nums[j]);}result.add(subset);}return result;}}
    

剑指offer 专项突破版 79、所有子集相关推荐

  1. LeetCode刷题 _「剑指 Offer]专项突破版

    第01天 整数 剑指 Offer II 001. 整数除法 class Solution:# 时间复杂度:O(logn), 空间复杂度:O(1)def divideCore(self, dividen ...

  2. 剑指Offer专项突破版(58)—— 日程表

    题目 剑指 Offer II 058. 日程表 思路 假设现在已经有一堆互不冲突的日程了,此时需要新增一个日程k,其开始时间为start,结束时间为end,怎么判断是否和已有的日程冲突呢? 先考虑所有 ...

  3. 剑指offer 专项突破版 74、合并区间

    题目链接 思路 注意合并区间的规则是,对于有重合的区间直接合并(重合意味着某一个区间的头部在另一个区间之中) 所以我们可以先把区间按照区间头排序,然后再挨个判断是否重合~ 注意具体的写法 class ...

  4. 剑指offer 专项突破版 78、合并排序链表

    题目链接 思路 最初的思路是上一题既然实现了归并两个链表,那么我们可以挨个归并~ 归并n-1次就可以,但是这样时间复杂度为O(k²n) class Solution {public ListNode ...

  5. 剑指offer 专项突破版 73、狒狒吃香蕉

    题目链接 思路 这个也是范围内的查找,一开始可以确定狒狒的速度区间应该是[1,maxVal],但是有两个细节需要注意 如何通过piles数组和speed计算时间 result += (pile + s ...

  6. 剑指offer专项突破版

    面试题1:整除除法 力扣连接:https://leetcode-cn.com/problems/xoh6Oh/submissions/ 题目描述 输入两个int型整数,它们进行除法计算并返回商,要求不 ...

  7. 剑指offer专项突击版第24天

    剑指 Offer II 071. 按权重生成随机数 二分+前缀和 看了几遍题目愣是没看明白,最后看的题解明白了! 题意就是按照 w[i]w[i]w[i] 的权重选取下标 iii,这个问题可以转化成:所 ...

  8. 剑指 Offer II 022. 链表中环的入口节点(力扣剑指Offer专项突击版——链表2)

    题目 给定一个链表,返回链表开始入环的第一个节点. 从链表的头节点开始沿着 next 指针进入环的第一个节点为环的入口节点.如果链表无环,则返回 null. 为了表示给定链表中的环,我们使用整数 po ...

  9. 剑指Offer Ⅱ 005.单词长度的最大乘积 (力扣剑指Offer专项突击版——整数_5)

    题目 给定一个字符串数组 words,请计算当两个字符串 words[i] 和 words[j] 不包含相同字符时,它们长度的乘积的最大值.假设字符串中只包含英语的小写字母.如果没有不包含相同字符的一 ...

最新文章

  1. 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题
  2. 聊聊redis的HealthIndicator
  3. iOS开发之 几本书
  4. NYOJ 题目528 找球号(三)
  5. 【NLP】为元宇宙拼了?FaceBook推出强大的多语言模型,试图理解所有人类语言...
  6. redis-cluster集群搭建
  7. 金古桥机器人_《泽塔奥特曼》奥特曼憋屈了,被机器人保护,金古桥可能才是主角...
  8. DB2中ixf文件的导入导出
  9. 『线段树及扫描线算法 Atlantis』
  10. linux服务器知识学习:了解Linux系统的启动过程
  11. Servlet中的请求转发
  12. 20.变量及数据类型
  13. myeclipse java设置_【使用指南】MyEclipse部署配置(多图)
  14. Python源码剖析 - Python的总体架构
  15. Spark代码2之Transformation:union,distinct,join
  16. Window应急响应(七 NesMiner挖矿病毒)
  17. java实现滑动验证码
  18. 租房心经--教你如何租房子
  19. PHP+Mysql 实现留言板
  20. 检测昵称是否含有敏感词汇

热门文章

  1. 解析老干妈:“逆营销”下,你不知道的事(转载)
  2. StringUtils isEmpty 和 isBlank 区别
  3. Eigen::Isometry3d入门
  4. ajax 文件上传 跨域,FormData解决ajax上传文件的问题及ajax跨域
  5. 2014年中国软件业有惊喜
  6. android 代码亮屏功能,Android Studio用代码唤醒手机屏幕并解锁
  7. amd ryzen7 1700 linux,从Ryzen7 1700移动版首测看AMD未来布局
  8. 华院计算 | 东方文艺复兴式的学者—朱载堉
  9. SAP 全球五大咨询公司
  10. 12年老外贸的经验分享