【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社区 重点重点:我没有买股票,没有买股票,股市是个坑,小心割韭菜哦. 本文的初衷是数据分析(分析结果就不说了,就是想看看筛选点数据),只不过搞 ...
随机推荐
- 算数运算符: + - * / //(地板除) %(取余) **(幂运算) / 比较运算符 > < >= <= == !=
# ### python运算符 #(1) 算数运算符: + - * / //(地板除) %(取余) **(幂运算) var1 = 5 var2 = 8 # +res = var1 + var2 pri ...
- [LeetCode] 90.Subsets II tag: backtracking
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the ...
- c# Resolve SQlite Concurrency Exception Problem (Using Read-Write Lock)
This article describes the c# example to solve the problem of SQlite concurrent exception method. To ...
- 强迫症犯了,忍不住赞一下slf4j包Logger.java的优雅代码
如下是slf4j-api包下的Logger接口类里其中几个方法的声明: package org.slf4j; public interface Logger { /** * Log a message ...
- C#设计模式(12)——享元模式(Flyweight Pattern)(转)
一.引言 在软件开发过程,如果我们需要重复使用某个对象的时候,如果我们重复地使用new创建这个对象的话,这样我们在内存就需要多次地去申请内存空间了,这样可能会出现内存使用越来越多的情况,这样的问题是非 ...
- phpcms栏目点击选中
点击选中(没有二级栏目) {pc:content action="category" catid="0" num="4" siteid=&q ...
- 分治法——归并排序(mergesort)
首先上代码. #include <iostream> using namespace std; int arr[11]; /*两个序列合并成一个序列.一共三个序列,所以用 3 根指针来处理 ...
- Sitecore开发 IP地理定位服务入门
如果您是营销人员或开发人员,并且有兴趣在Sitecore安装中使用Sitecore IP Geolocation服务,那么本文就是为您准备的. 借助Sitecore IP地理定位服务,您网站的访问者可 ...
- 文件上传中UUID的解读
UUID简介如下:1.简介UUID含义是通用唯一识别码 (Universally Unique Identifier),这 是一个软件建构的标准,也是被开源软件基金会 (Open Software F ...
- Java 实现追加excle文件内容
Java 实现追加excle文件内容 一.示例一:excle(.xlsx) //jar import java.io.BufferedReader; import java.io.File; impo ...