LeetCode OJ 78. Subsets
Given a set of distinct integers, nums, 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 nums = [1,2,3], a solution is:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
【题目分析】
这个题目是求一个集合的子集,要求子集中的元素不能降序排列,而且不含有重复的元素。
【思路】
求一个集合的所有子集我们可以考虑子集中包含集合的若干个元素,从0个到n(集合的大小)。如果含有0个元素,就是空集,含有一个元素的话就是把集合中每个元素取一次,含有两个元素的话就是找到集合中所有两个元素的组合......以此类推。
问题是这个过程该如何描述呢?假设我们要从一个增序排序的集合中选取所有两个元素的组合,从集合中开始选取一个之前没有选过的元素a,然后再从这个元素后面选择一个元素b。当我们开始找下一个组合时,需要回溯到当前组合,删除元组中的第二个元素b,然后继续向后寻找。同样当我们找到所有第一个元素为a的所有二元子集时,我们需要删除a,然后在a后面找到下一个二元组的开始元素a2,然后继续上面的过程。因此这个过程是一个递归回溯的过程。
回溯法
回溯法按深度优先策略搜索问题的解空间树。首先从根节点出发搜索解空间树,当算法搜索至解空间树的某一节点时,先利用剪枝函数判断该节点是否可行(即能得到问题的解)。如果不可行,则跳过对该节点为根的子树的搜索,逐层向其祖先节点回溯;否则,进入该子树,继续按深度优先策略搜索。
回溯法的基本行为是搜索,搜索过程使用剪枝函数来为了避免无效的搜索。剪枝函数包括两类:1. 使用约束函数,剪去不满足约束条件的路径;2.使用限界函数,剪去不能得到最优解的路径。
问题的关键在于如何定义问题的解空间,转化成树(即解空间树)。解空间树分为两种:子集树和排列树。两种在算法结构和思路上大体相同。
【java代码】
public class Solution {
public List<List<Integer>> subsets(int[] nums) {
List<List<Integer>> list = new ArrayList<>();
List<Integer> clist = new ArrayList<>();
list.add(clist);
if(nums == null) return list;
Arrays.sort(nums);
for(int i = 1; i <= nums.length; i++){
clist.clear();
DFS(nums, 0, i, clist, list);
}
return list;
}
public void DFS(int[] nums, int start, int number, List<Integer> clist, List<List<Integer>> list){
if(number == clist.size()){
list.add(new ArrayList<>(clist));
return;
}
for(int i = start;i < nums.length; i++) {
clist.add(nums[i]);
DFS(nums, i+1, number, clist, list);
clist.remove(clist.size()-1);
}
}
}
public class Solution {
public List<List<Integer>> subsets(int[] nums) {
Arrays.sort(nums);
List<List<Integer>> ret = new ArrayList<>();
dfs(nums, 0, new ArrayList<>(), ret);
return ret;
}
private void dfs(int[] nums, int idx, List<Integer> path, List<List<Integer>> ret) {
ret.add(path);
for (int i = idx; i < nums.length; i++) {
List<Integer> p = new ArrayList<>(path);
p.add(nums[i]);
dfs(nums, i+1, p, ret);
}
}
}
LeetCode OJ 78. Subsets的更多相关文章
- 【LeetCode】78. Subsets 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 回溯法 日期 题目地址:https://leet ...
- 【一天一道LeetCode】#78. Subsets
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【LeetCode】78. Subsets (2 solutions)
Subsets Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset ...
- LeetCode OJ:Subsets(子集)
Given a set of distinct integers, nums, return all possible subsets. Note: Elements in a subset must ...
- LeetCode OJ:Subsets II(子集II)
Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...
- 【一天一道LeetCode】#90. Subsets II
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- 【LeetCode】90. Subsets II 解题报告(Python & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 回溯法 日期 题目地址:https://leet ...
- LeetCode OJ——Subsets
http://oj.leetcode.com/problems/subsets/ 计算一个集合的子集,使用vector<vector<int> >,使用了进制的思想. #inc ...
- [LeetCode] 78. Subsets 子集合
Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...
随机推荐
- [Python]-类型转换
1.字符串到数值的转换:int(s [,base ]) 将表达式s转换为一个整数 ,s可以是整数,与数字有关的字符串,布尔类型long(s [,base ]) 将表达式s转换为一个长整数 s可以是整数 ...
- (转载)js 快捷键大全,并有简单使用说明
摘要: (转载)原文链接: http://www.cnblogs.com/fire-phoenix/archive/2010/09/28/1837295.html Code highlighting ...
- BIEE基本函数
一,TRIM ,去除空字符 TRIM(EXPR) SUBSTRING("UT TIME"."月份" FROM 6 FOR 2) 1.AGGREGATE AT 此 ...
- table表头thead固定
<html> <head> <meta charset="utf-8"/> <script type="text/javascr ...
- CentOS python升级到3.5时yum报错
File except KeyboardInterrupt, e: ^ SyntaxError: invalid syntax 解决步骤: #vi /usr/bin/yum 将#!/usr/bin/p ...
- 集成shareSDK的微信、QQ API导致cocoaPods找不到类symbol问题的解决方法
因为shareSDK的微信和QQ API都只支持32位的,而cocoaPods默认要支持64位的,所以如果在工程中导入这两个API会出问题. 解决方法我就不转载啦,原文在这里: http://blog ...
- Quartz+log4net实现控制台程序定时运行,并且记录日志
c# 控制台程序定时运行,并记录日志. 组件Quartz + log4net Quartz定时运行程序,log4net记录日志. 首先建立控制台程序"QuartzTest" 安装Q ...
- IO流数据读写总结
1.用java自带的IO读写方法 官方API网站:http://docs.oracle.com/javase/7/docs/api/ 2.Apache的Commons-io-2.4.jar中的方法,参 ...
- perl LWP::UserAgent获取源码与响应
#!/usr/bin/perl -w use strict; use LWP::UserAgent; my $useragent = new LWP::UserAgent; my $url = 'ht ...
- c++字体对齐
字节对齐的细节和编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除. 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是 ...