<LeetCode OJ> 78 / 90 Subsets (I / II)
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],
[]
]
分析:
的题目意思基本一样,主要差别在于还须要对不同的len的子数组进行回溯,所以回溯法终于确定答案的方式不一样。
(本题是用len作为回溯时确定答案的根据)
class Solution {
public:
void dfs(vector<int>& nums, vector<int> &subres, int start, int len)//使用引用,有利于防止内存大爆炸
{
if (subres.size() == len)//已经获得答案。而且回溯
{
result.push_back(subres);
return;//回溯
}
for (int i = start; i < nsize; i++)
{
subres.push_back(nums[i]);
dfs(nums, subres, i + 1, len);
subres.pop_back(); // 完毕一个解后去掉末尾元素 ,准备下一次回溯寻找答案
}
}
vector<vector<int>> subsets(vector<int>& nums) {
nsize=nums.size();
if ( nsize == 0)
return result;
sort(nums.begin(),nums.end()); //一,先排序
vector<int> subres;
for(int len=0; len<=nums.size() ;len++)//二,对不同长度的子数组进行回溯
dfs(nums, subres, 0, len);
return result;
}
private:
vector<vector<int > > result;
int nsize;
};
Submissions: 208285 Difficulty: Medium
Given a collection of integers that might contain duplicates, 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,2], a solution
is:
[
[2],
[1],
[1,2,2],
[2,2],
[1,2],
[]
]
分析:
比上面的代码多加入一个同样组合不要的回溯条件就可以,只是代码的速度尽然打败了0.89%,也就是说极慢的速度。感觉不会再爱了。
class Solution {
public:
void dfs(vector<int>& nums, vector<int> &subres, int start, int len)//使用引用,有利于防止内存大爆炸
{
if (subres.size() == len)//已经获得答案。而且回溯
{
if(!isSameVec(subres)) //已经出现过的组合不要。
result.push_back(subres);
return;//回溯
}
for (int i = start; i < nsize; i++)
{
subres.push_back(nums[i]);
dfs(nums, subres, i + 1, len);
subres.pop_back(); // 完毕一个解后去掉末尾元素 。准备下一次回溯寻找答案
}
}
bool isSameVec(vector<int> &sub)
{
for(int i=0;i<result.size();i++)
{
if(result[i]==sub)
return true;
}
return false;
}
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
nsize=nums.size();
if ( nsize == 0)
return result;
sort(nums.begin(),nums.end()); //一,先排序
vector<int> subres;
for(int len=0; len<=nums.size() ;len++)//二,对不同长度的子数组进行回溯
dfs(nums, subres, 0, len);
return result;
}
private:
vector<vector<int > > result;
int nsize;
};
学习别人的算法:
class Solution {
public:
void dfs(vector<int> &s, int index, vector<int> &subset, vector<vector<int>> &res)
{
res.push_back(subset);
for(int i = index; i< s.size(); i++)
{
if(i!=index && s[i]==s[i-1])
continue;
subset.push_back(s[i]);
dfs(s,i+1,subset,res);
subset.pop_back();
}
}
vector<vector<int> > subsetsWithDup(vector<int> &S) {
// Note: The Solution object is instantiated only once.
vector<vector<int>> result;
sort(S.begin(),S.end());
vector<int> subset;
dfs(S,0,subset,result);
return result;
}
};
注:本博文为EbowTang原创,兴许可能继续更新本文。假设转载。请务必复制本条信息!
原文地址:http://blog.csdn.net/ebowtang/article/details/50844984
原作者博客:http://blog.csdn.net/ebowtang
本博客LeetCode题解索引:http://blog.csdn.net/ebowtang/article/details/50668895
<LeetCode OJ> 78 / 90 Subsets (I / II)的更多相关文章
- LeetCode OJ 95. Unique Binary Search Trees II
Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...
- LeetCode OJ Remove Duplicates from Sorted Array II
Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? For exampl ...
- LeetCode OJ:Search a 2D Matrix II(搜寻二维矩阵)
Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...
- LeetCode OJ :Unique Binary Search Trees II(唯一二叉搜索树)
题目如下所示:返回的结果是一个Node的Vector: Given n, generate all structurally unique BST's (binary search trees) th ...
- leetcode 78. Subsets 、90. Subsets II
第一题是输入数组的数值不相同,第二题是输入数组的数值有相同的值,第二题在第一题的基础上需要过滤掉那些相同的数值. level代表的是需要进行选择的数值的位置. 78. Subsets 错误解法: cl ...
- LeetCode Problem 90. Subsets II
python solution 123456789101112131415161718192021222324252627 class (object): def subsetsWithDup(sel ...
- LeetCode OJ 题解
博客搬至blog.csgrandeur.com,cnblogs不再更新. 新的题解会更新在新博客:http://blog.csgrandeur.com/2014/01/15/LeetCode-OJ-S ...
- LeetCode OJ:Integer to Roman(转换整数到罗马字符)
Given an integer, convert it to a roman numeral. Input is guaranteed to be within the range from 1 t ...
- 【LeetCode OJ】Interleaving String
Problem Link: http://oj.leetcode.com/problems/interleaving-string/ Given s1, s2, s3, find whether s3 ...
随机推荐
- hdu 1533 KM或费用流
以前用KM写过,现在再用费用流写. #include <iostream> #include <cstdio> #include <cstring> #includ ...
- HDU 4619 Warm up 2 最大独立集
Warm up 2 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=4619 Description Some 1×2 dominoes are pla ...
- vscode 插件设置
VS Code 安装插件 prettier Beautify vscode 首选项 --> 设置 "editor.detectIndentation": false, &qu ...
- Windows用WinDbg分析蓝屏dump文件查找原因(转)
WinDbg官方下载: http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi http://msdl. ...
- Cocos2d-x3.0 解压zip
2dx3.0为我们集成了unzip库,帮助我们实现对文件的解压,但使用起来略显复杂我这里封装了一个解压工具库.分享一下. 工具类下载:http://download.csdn.net/detail/q ...
- 支持Tasker控制的app合集
跟各种Tasker插件打交道,原因有两点: 1.站在开发者的角度:Tasker虽为神器,也不能面面俱到,一个原因就是Android自身过于分裂化造成的,不可能兼顾全平台和机型:个人开发者精力有限,也满 ...
- CMoReader
#ifndef __E3GLOGLOADBYFILE_H__ #define __E3GLOGLOADBYFILE_H__ #include "PubCommon\MemoryManager ...
- 淘宝API开发第一步
1.登录淘宝开放平台:http://open.taobao.com/ 2.添加网站 (验证完网站后,会提醒“JSSDK以激活提交审核按钮”,这个需要的UV达100,按钮才会亮,审核过程中也得保持UV的 ...
- sqlserver锁机制详解(sqlserver查看锁)
简介 在SQL Server中,每一个查询都会找到最短路径实现自己的目标.如果数据库只接受一个连接一次只执行一个查询.那么查询当然是要多快好省的完成工作.但对于 大多数数据库来说是需要同时处理多个查询 ...
- 如何快速把安卓应用移植到BlackBerry 10上
如何快速把安卓应用移植到BlackBerry 10上 相关博客: BlackBerry相关文档 http://developer.blackberry.com/android/documentatio ...