【lintcode17/18】Subset, SubsetII
题目:给定一个含不同整数的集合,返回其所有的子集。
样例:如果 S = [1,2,3],有如下的解:[[3],[1],[2],[1,2,3],[1,3],[1,2],[2,3],[]]
思路:因为此题求所有子集,自然想到用深度优先搜索的方法。如下树,根节点为空集,从根结点开始进行深度搜索。首先寻找到[1],再找以[1]开头所有元素,向下找到[1,2],再找以[1,2]开头的所有元素集合,从而找到[1,2,3]。此时已无法搜索更深层,变向上回溯。回溯到[1]结点,搜索到[1,3]。再向上回溯,直到搜索完整棵树为止。

public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums.length == 0){
result.add(new ArrayList<Integer>());
return result;
}
if(nums == null){
return result;
}
Arrays.sort(nums);
helper(new ArrayList<Integer>(), nums, 0, result);
return result;
}
private void helper(ArrayList<Integer> subset, int[] nums, int startIndex,
List<List<Integer>> result){
result.add(new ArrayList<Integer>(subset));
for(int i = startIndex; i<nums.length; i++){
subset.add(nums[i]);
helper(subset, nums, i+1, result);
subset.remove(subset.size()-1);
}
}
题目:给定一个可能具有重复数字的列表,返回其所有可能的子集。
样例:如果 S = [1,2,2],有如下的解:[[2],[1],[1,2,2],[2,2],[1,2],[]]
思路:此题的输入子集的元素可能有重复值,如果按上一题的思路,以上样例会出现两个[1,2],为了避免第二个[1,2]的出现,在插入前做一个判断。判断当前值是否和上一个值相等(因为数列已是有序的),并且上一个值是否已经被选入,同时下标不溢出,即跳出循环,避免重复。
if(i!=0&&nums[i]==nums[i-1]&&i!=startIndex)
{
continue;
}
public List<List<Integer>> subsetsWithDup(int[] nums) {
List<List<Integer>> result = new ArrayList<>();
if (nums.length == 0){
result.add(new ArrayList<Integer>());
return result;
}
if(nums == null){
return result;
}
Arrays.sort(nums);
helper(new ArrayList<Integer>(), nums, 0, result);
return result;
}
private void helper(ArrayList<Integer> subset, int[] nums, int startIndex,
List<List<Integer>> result){
result.add(new ArrayList<Integer>(subset));
for(int i = startIndex; i<nums.length; i++){
if(i!=0&&nums[i]==nums[i-1]&&i!=startIndex)
{
continue;
}
subset.add(nums[i]);
helper(subset, nums, i+1, result);
subset.remove(subset.size()-1);
}
}
【lintcode17/18】Subset, SubsetII的更多相关文章
- 【设计模式 - 18】之备忘录模式(Memento)
1 模式简介 备忘录模式的定义: 备忘录模式保存一个对象的某个状态,以便在适当的时候恢复对象,用作"后悔药",即取消上次操作或返回到以前的某个版本. 备忘录模式的应用实例 ...
- 【33.18%】【hdu 5877】Weak Pair (3种解法)
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) Total Submissi ...
- 【Luogu】【关卡1-8】BOSS战-入门综合练习2(2017年10月)【AK】------都是基础题
P1426 小鱼会有危险吗 我个人觉得这个题目出的不好,没说明白,就先只粘贴的AC代码吧 #include <bits/stdc++.h> using namespace std; int ...
- 【LeetCode 18】四数之和
题目链接 [题解] 两重循环枚举[i..j]这个区间 同时规定必取nums[i]和nums[j] 那么现在的问题就变成在下标为[i..j]这个区间的数字里面找两个数字使他们的和为target-nums ...
- 【Python 18】BMR计算器2.0(数值类型转换与while循环)
1.案例描述 基础代谢率(BMR):我们安静状态下(通常为静卧状态)消耗的最低热量,人的其他活动都建立在这个基础上. 计算公式: BMR(男) = (13.7*体重kg)+(5.0*身高cm)-(6. ...
- Python【day 18】面向对象-类和类的关系
一.昨日内容回顾 成员 1.变量 1.成员变量--最常见 1.写法: 变量前面加了self就是成员变量 这里的self表示当前对象 一般是在构造方法中定义 2.调用: 对象.成员变量 3.作用: 可以 ...
- 【Python 1-8】Python手把手教程之——管理列表List
遍历列表 在日常开发中,我们经常需要遍历列表的所有元素,对每个元素执行相同的操作.例如,在管理商场的蔬菜时候,需要给所有的蔬菜商品都打7折,并重新生成价格.当我们需要对列表中的每个元素都执行相同的操作 ...
- 【程序18】求s=a+aa+aaa+aaaa+aa...a的值
求s=a+aa+aaa+aaaa+aa-a的值,其中a是一个数字.例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制. 知识点:在Python 3里,reduce( ...
- 【开源】C#.NET股票历史数据采集,【附18年历史数据和源代码】
如果用知乎,可以关注专栏:.NET开源项目和PowerBI社区 重点重点:我没有买股票,没有买股票,股市是个坑,小心割韭菜哦. 本文的初衷是数据分析(分析结果就不说了,就是想看看筛选点数据),只不过搞 ...
随机推荐
- java框架之Spring(3)-JDBC模板使用&事务管理
下面内容使用到的 jar 包下载 JDBC模板使用 入门 1.导包,如要导入 Spring 的基本开发包.数据库驱动包.Spring 提供的 JDBC 模板包,如下: 2.测试: @Test publ ...
- vue的二维码生成器
vue项目开发的时候经常会遇到需要将一个网址链接转化为二维码的需求,方便用户扫描观看,以下就是我在寻找vue二维码生成器的时候踩过的坑. 不能用的二维码生成器 qrcode node-qr ...
- 010 Editor - Binary Templates
010 Editor是一款非常强大的文本/十六进制编辑器,除了文本/十六进制编辑外,还包括文件解析.计算器.文件比较等功能,但它真正的强大之处还在于文件的解析功能.我们可以使用010Edito ...
- cocos2d-x JS 重力感应监听事件
说明 : 下面监听中的 acc属性 里面有很多可以使用的值 . 添加监听 : cc.inputManager.setAccelerometerEnabled(true); cc.eventManage ...
- Tomcat出现The origin server did not find a current representation for the target resourc...
访问页面出现404 解决方法: https://blog.csdn.net/dbc_121/article/details/79204340 我的问题主要还是在tomcat调整上, 对了,关于loca ...
- GDI+案例
// // request_handler.cpp // ~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2017 Christopher M. Kohlho ...
- Git换行符是如何精确控制的
Git换行符是如何精确控制的 Checkout Windows-style, commit Unix-style Git will convert LF to CRLF when checking o ...
- 0004-20180422-自动化第五章-python基础学习笔记
内容回顾:1.数据类型 2.for和while循环 continue break #如下循环将怎么打印结果? for i in range(1,10): print(i) for i in range ...
- C#简单的九九乘法表
for(int i=1;i<10;i++) { for(int j=1;j<=i;j++) { Console.Write("{0}*{1}={2}",j,i,i*j) ...
- bind 笔记
BIND 的安装和配置: dns 服务,程序包名为bind ,程序名称为named 只需要安装 bind ,bind-libs ,bind-utils 生产环境全部安装 bind 服务脚本 :/etc ...