LeetCode 腾讯精选50题--子集

根据题意,找到几何中的所有子集,说实话子集是没有什么头绪的,因为如果采用遍历的方法,稍有遗漏不说,代码的嵌套循环层数随着数组大小的增加而增加,想了很久没有头绪后就去看了看评论,然后就被点破了解题的关键:遍历数组时,让当前这一元素构成的集合,分别去加上之前找到的所有子集,由于第一次找到的子集一定有两个,一个为空,一个带有一个元素,那么用当前元素组成的集合分别加上之前的集合,一定会有一个集合只有当前元素

如图:

由于采用遍历的方式,对于数组长度为N,指针没往前走一次,要遍历的子集数量是原来的2倍,所以此算法的时间复杂度就是等比数列求和后的复杂度,即为O(2^N)

以下是代码:

 1 package algorithm;
 2
 3 import java.util.ArrayList;
 4 import java.util.List;
 5
 6 public class SubCollection {
 7     public List<List<Integer>> subsets(int[] nums) {
 8
 9         List<List<Integer>> totalSubLists = new ArrayList<>();
10
11         for (int i = nums.length-1; i >=0; i--) {
12             if(totalSubLists.size()==0){
13                 List<Integer> self = new ArrayList<>();
14                 self.add(nums[i]);
15                 totalSubLists.add(self);
16                 totalSubLists.add(new ArrayList<>());
17             }else {
18                 int size = totalSubLists.size();
19                 int se=0;
20                 while (true){
21                     List<Integer> self = new ArrayList<>();
22                     self.add(nums[i]);
23                     self.addAll(totalSubLists.get(se++));
24                     totalSubLists.add(self);
25                     if(se >= size){
26                         break;
27                     }
28
29                 }
30             }
31         }
32
33         return totalSubLists;
34     }
35
36 }

原文地址:https://www.cnblogs.com/Kaithy-Rookie/p/11323603.html

时间: 2024-11-07 20:47:56

LeetCode 腾讯精选50题--子集的相关文章

LeetCode 腾讯精选50题-- 买卖股票的最佳时机 II

贪心算法: 具体的解题思路如下: II 的解题思路可以分为两部分, 1. 找到数组中差值较大的两个元素,计算差值. 2. 再步骤一最大的元素的之后,继续遍历,寻找差值最大的两个元素 可以得出的是,遍历指针是一直向着数组的尾部移动的,由于要取得局部的最大差值,这一局部子数组中的元素一定是递增的,所以先找到递增结束的位置,那就是递增位置的起点,然后遍历至此轮递增结束时的位置,这样就得到了一个局部的最优解. 此思路由于指针只遍历一次,所以时间复杂度为O(N). 以下是代码: class Solutio

leetcode腾讯精选练习(50 题)(持续更新)

1.除自身以外数组的乘积 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1,2,3,4]输出: [24,12,8,6]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题. 题解:记录前缀积和后缀积. 参考代码: class Solution { public: vector<int> productExceptSelf(vector&

leetcode腾讯精选练习之除自身以外数组的乘积(十)

最长公共前缀 题目 给定长度为?n?的整数数组?nums,其中?n > 1,返回输出数组?output?,其中 output[i]?等于?nums?中除?nums[i]?之外其余各元素的乘积. 示例: 输入: [1,2,3,4] 输出: [24,12,8,6] 说明: 请不要使用除法,且在?O(n) 时间复杂度内完成此题. 思路 第一种思路O(n2):但是不符合题目要求 两层循环遍历,思路很简单不详细说了第一层遍历数组中中的每个数,第二层遍历求解除了本身之外的乘积. 第二种思路就是除法:也不符合

leetcode腾讯精选练习之最长公共前缀(九)

最长公共前缀 题目 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串?"". 示例?1: 输入: ["flower","flow","flight"] 输出: "fl" 示例?2: 输入: ["dog","racecar","car"] 输出: "" 解释: 输入不存在公共前缀. 说明: 所有输入

LeetCode OJ Linked List: 138题、109题和191题

138题:Copy List with Random Pointer 题目分析: 本题思路1:第一步,你需要遍历一下链表,对于每个结点,你都new出一个连接在其后面.第二步,调整random指针.第三步,把复制的链表与原链表断开.时间复杂度O(N),空间复杂度O(1). 本题思路2:第一步,仍需要遍历一下链表,对于每个结点都new出一个节点,但不连接在其后面,把这种旧节点到新结点的映射关系,存储在map中.第二步,调整random指针.时间复杂度O(N),空间复杂度O(N). 本题思路3:第一步

JavaScript编程题(含腾讯2016校招题)

作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几道觉得挺有意思的编程题,感觉做下来,自己对一些新方法的看法有了新的变化. 比如indexOf,reduce,Array.isArray,forEach这些方法,以前一看到兼容性是IE9+就有点害怕,项目中不敢用,导致后面越来越陌生,不过现在一想的话.其实只要用Polyfill或者提前fix掉就可以了

sql语句练习50题

sql语句练习50题 Student(Sid,Sname,Sage,Ssex) 学生表 Course(Cid,Cname,Tid) 课程表 SC(Sid,Cid,score) 成绩表 Teacher(Tid,Tname) 教师表 练习内容: 1.查询“某1”课程比“某2”课程成绩高的所有学生的学号: SELECT a.sid FROM (SELECT sid,score FROM SC WHERE cid=1) a,(SELECT sid,score FROM SC WHERE cid=3) b

Leetcode:Subsets 求数组的所有子集

Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be in non-descending order. The solution set must not contain duplicate subsets. For example, If S = [1,2,3], a solution is: [ [3], [1], [2], [1,2,3], [

50题(ACM学习推荐题)

POJ推荐50题 1. 标记"难"和"稍难"的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉. 2. 标记为 A and B 的题目是比较相似的题目,建议大家两个一起做,可以对比总结,且二者算作一个题目. 3. 列表中大约有70个题目.大家选做其中的50道,且每类题目有最低数量限制. 4. 这里不少题目在 BUPT ACM FTP 上面都有代码,请大家合理利用资源. 5. 50个题目要求每个题目都要写总结,养成良好的习惯. 9. 这个列表的目的在于让