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 ...
随机推荐
- 【IE6的疯狂之五】div遮盖select的解决方案
IE6以及一下版本下,选择框Select会覆盖Div中的内容一般情况下,可以将显示的内容放到Iframe中,然后再显示框架内的内容.由于Iframe的可以显示在Select上层,就可以解决这个问题.不 ...
- USACO 3.2 Stringsobits
StringsobitsKim Schrijvers Consider an ordered set S of strings of N (1 <= N <= 31) bits. Bits ...
- linux显示行数命令
linux 如何显示一个文件的某几行(中间几行) [一]从第3000行开始,显示1000行.即显示3000~3999行 cat filename | tail -n +3000 | head -n 1 ...
- ubuntu 14.04中文分词 结巴分词
在自然语言处理中,很常见的是要对文本数据进行分词处理.博主是代码小白,目前只是用python作为数据预处理的工具,而按照结巴中文分词的导语:做最好的python中文分词组件“jieba”.因而博主也就 ...
- SQLite模糊查找(like)
select UserId,UserName,Name,Sex,Birthday,Height,Weight,Role from xqhit_Users where UserName like &qu ...
- js的兼容技巧
javascript原生代码中经常会遇到各式各样浏览器不兼容的问题,浏览器真是倔强,解决浏览器的兼容是前端猿们的一大难题 为了避免在工作中遇到这些简单的问题.节约开发时间,在这里总结一些常用的浏览器兼 ...
- Dynamics CRM 相关资料
links: 1.The Microsoft Dynamics CRM Team Blog 2.申请试用Dynamics CRM 2013 http://www.microsoft.com/zh-cn ...
- uiscrollview 事件冲突
self.scrollView.panGestureRecognizer.delaysTouchesBegan = YES;设置scrollView的延迟接收点击触摸事件,关闭触摸事件 self.sc ...
- svn中“clean up”死循环问题解决办法
SVN在使用update命令时,提示使用"clean up "命令,在使用clean up命令时报错"Previous operation has not finishe ...
- C#变量修饰符
访问修饰符 关键字包括:internal,public,protected和private,用于设置变量的访问级别. public 变量可以做为它所属的类型的一个字段,可以在任何地方访问它. i ...