热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

leetcode78.Subsets

Givenasetofdistinctintegers,nums,returnallpossiblesubsets.Note:Thesolutionsetmustnotcontai

Given a set of distinct integers, nums, return all possible subsets.

Note: The solution set must not contain duplicate subsets.

For example,
If nums = [1,2,3], a solution is:

[[3],[1],[2],[1,2,3],[1,3],[2,3],[1,2],[]
] 蛮简单的题目,用递归就能完成:当前元素:取/不取,再递归到下一个元素。

public List> subsets(int[] nums) {List> result&#61;new ArrayList>();List list&#61;new ArrayList<>();helper(nums, 0,result,list);return result;
}public void helper(int[] nums,int index,List> result,List list){if(index&#61;&#61;nums.length){result.add(list);return;}List newList&#61;new ArrayList<>(list);helper(nums, index&#43;1, result, newList);newList&#61;new ArrayList<>(list);newList.add(nums[index]);helper(nums, index&#43;1, result, newList);
}
还有大神没有用递归&#xff0c;思路也很好。

起始subset集为&#xff1a;[]
添加
S0后为&#xff1a;[], [S0]
添加
S1后为&#xff1a;[], [S0], [S1], [S0, S1]
添加
S2后为&#xff1a;[], [S0], [S1], [S0, S1], [S2], [S0, S2], [S1, S2], [S0, S1, S2]
红色
subset为每次新增的。显然规律为添加Si后&#xff0c;新增的subset为克隆现有的所有subset&#xff0c;并在它们后面都加上Si
这样的话就只要迭代就能解决了。

public class Solution {public List> subsets(int[] S) {List> res &#61; new ArrayList<>();res.add(new ArrayList()); Arrays.sort(S);for(int i : S) {List> tmp &#61; new ArrayList<>();for(List sub : res) {List a &#61; new ArrayList<>(sub);a.add(i);tmp.add(a);}res.addAll(tmp);}return res;}
}
除这两种方法之外&#xff0c;大神还有另外一种与众不同的方法&#xff1a;bit-manipulation&#xff01;

{1 , 2 , 3 }的子集个数 &#61; 2^3 .为什么? 考虑到数组中每个元素是否取的情况1 -> 取 or 不取 &#61; 2 2 -> 取 or 不取 &#61; 2 3 -> 取 or 不取 &#61; 2 所以&#xff0c;总的情况 &#61; 2*2*2 &#61; 2^3 &#61; { { } , {1} , {2} , {3} , {1,2} , {1,3} , {2,3} , {1,2,3} }让我们用 1 和 0 来表示取或者不取。数组中有三个元素&#xff0c;因此需要3个bit&#xff0c;其中低位->高位表示nums[0]~nums[n]
取 &#61; 1
不取 &#61; 0
0) 0 0 0 -> 不取 3 , 不取 2 , 不取 1 &#61; { }
1) 0 0 1 -> 不取 3 , 不取 2 , 取 1 &#61; {1 }
2) 0 1 0 -> 不取 3 , 取 2 , 不取 1 &#61; { 2 }
3) 0 1 1 -> 不取 3 , 取 2 , 取 1 &#61; { 1 , 2 }
4) 1 0 0 -> 取 3 , 不取 2 , 不取 1 &#61; { 3 }
5) 1 0 1 -> 取 3 , 不取 2 , 取 1 &#61; { 1 , 3 }
6) 1 1 0 -> 取 3 , 取 2 , 不取 1 &#61; { 2 , 3 }
7) 1 1 1 -> 取 3 , 取 2 , 取 1&#61; { 1 , 2 , 3 } 在上面的逻辑中&#xff0c;只有当 (j>>i)&1 &#61;&#61;true {其中 j ∈ {0,1,2,3,4,5,6,7}&#xff0c;i 是 nums[]的索引} 时&#xff0c;才进行 Insert S[i] 的操作。
因此&#xff0c;数字1只有当最右bit是1的时候才被插入&#xff0c;&#xff08; j &#61; 1,3,5,7 时&#xff09;
数字2只有当第二右bit是1的时候才被插入&#xff0c;( j &#61; 2,3,6,7 时&#xff09;
数字3只有当第三右bit是1的时候才被插入&#xff0c;( j &#61; 4,5,6,7 时&#xff09;该解法时间复杂度 : O(n * 2^n)

public List> subsets(int[] S) {Arrays.sort(S);int totalNumber &#61; 1 <> collection &#61; new ArrayList>(totalNumber);for (int i&#61;0; i set &#61; new LinkedList();for (int j&#61;0; j}



推荐阅读
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 本文介绍了解决Facebook脸书面试题中插入区间的方法,通过模拟遍历的方式判断当前元素与要插入元素的关系,找到插入点并将新区间插入。同时对算法的时间复杂度和空间复杂度进行了分析。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • MPLS VP恩 后门链路shamlink实验及配置步骤
    本文介绍了MPLS VP恩 后门链路shamlink的实验步骤及配置过程,包括拓扑、CE1、PE1、P1、P2、PE2和CE2的配置。详细讲解了shamlink实验的目的和操作步骤,帮助读者理解和实践该技术。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
author-avatar
永城之家_319
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有