【Subsets II】cpp
题目:
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],
[]
]
代码:
class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            std::sort(nums.begin(), nums.end());
            vector<vector<int> > ret;
            vector<int> tmp;
            Solution::dfs(ret, nums, , tmp);
            return ret;
    }
    static void dfs(vector<vector<int> >& ret, vector<int>& nums, int index, vector<int>& tmp )
    {
            if ( index==nums.size() )
            {
                ret.push_back(tmp);
                return;
            }
            tmp.push_back(nums[index]);
            Solution::dfs(ret, nums, index+, tmp);
            tmp.pop_back();
            if ( !(tmp.size()>= && tmp.back()==nums[index]) )
            {
                Solution::dfs(ret, nums, index+, tmp);
            }
    }
};
tips:
大体思路与Subsets类似(http://www.cnblogs.com/xbf9xbf/p/4516802.html)
经过画图推演:dfs向左边走的条件不变;再向右边走时,如果当前节点的最后一个元素与即将要加入的新元素相同,则不往右边走了。因为再往右边走,右边肯定包含左边的重复子集了。
===================================
再补充一个增量构造法的迭代解法,代码如下:
class Solution {
public:
    vector<vector<int>> subsetsWithDup(vector<int>& nums) {
            std::sort(nums.begin(), nums.end());
            vector<vector<int> > ret;
            vector<int> none;
            ret.push_back(none);
            int pureNew = ;
            for ( size_t i = ; i < nums.size(); ++i )
            {
                vector<vector<int> > tmp = ret;
                size_t begin = ;
                if ( i>= && nums[i]==nums[i-] )
                {
                    begin = ret.size()-pureNew;
                }
                for ( size_t j = begin; j < tmp.size(); ++j )
                {
                    tmp[j].push_back(nums[i]);
                    ret.push_back(tmp[j]);
                }
                pureNew = ret.size() - tmp.size();
            }
            return ret;
    }
};
tips:
增加新元素前,判断nums[i]==nums[i-1]的条件是否成立;如果成立,则增量应该只作用于上一轮新增加的子集上,这样保证没有重复的;这个思路也很简洁。
学习了几个blog的思路:
http://bangbingsyb.blogspot.sg/2014/11/leetcode-subsets-i-ii.html
http://www.cnblogs.com/TenosDoIt/p/3451902.html
http://www.cnblogs.com/yuzhangcmu/p/4211815.html
完毕。
============================================
第二次过这道题,只用dfs的写法。再次画画图,理解一下。
class Solution {
public:
        vector<vector<int> > subsetsWithDup(vector<int>& nums)
        {
            sort(nums.begin(), nums.end());
            vector<vector<int> > ret;
            vector<int> tmp;
            Solution::dfs(ret, nums, , tmp);
            return ret;
        }
        static void dfs(
            vector<vector<int> >& ret,
            vector<int>& nums, int index,
            vector<int>& tmp)
        {
            if ( index==nums.size() )
            {
                ret.push_back(tmp);
                return;
            }
            tmp.push_back(nums[index]);
            Solution::dfs(ret, nums, index+, tmp);
            tmp.pop_back();
            if ( !(tmp.size()> && tmp.back()==nums[index]) )
            {
                Solution::dfs(ret, nums, index+, tmp);
            }
        }
};
用深搜的好处就体现出来了。
【Subsets II】cpp的更多相关文章
- 【N-Quens II】cpp
		
题目: Follow up for N-Queens problem. Now, instead outputting board configurations, return the total n ...
 - leetcode 【 Subsets II 】python 实现
		
题目: Given a collection of integers that might contain duplicates, S, return all possible subsets. No ...
 - 【Permutations II】cpp
		
题目: Given a collection of numbers that might contain duplicates, return all possible unique permutat ...
 - 【Word Break II】cpp
		
题目: Given a string s and a dictionary of words dict, add spaces in s to construct a sentence where e ...
 - 【Unique Paths II】cpp
		
题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...
 - 【Path Sum II】cpp
		
题目: Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the give ...
 - 【Unique Binary Search Trees II】cpp
		
题目: Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. F ...
 - 【Populating Next Right Pointers in Each Node II】cpp
		
题目: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given ...
 - 【Binary Tree Level Order Traversal II 】cpp
		
题目: Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from ...
 
随机推荐
- JavaScript模块化---AMD规范
			
JavaSript模块化 在了解AMD,CMD规范前,还是需要先来简单地了解下什么是模块化,模块化开发? 模块化是指在解决某一个复杂问题或者一系列的杂糅问题时,依照一种分类的思维把问 题进行系 ...
 - 利用jQuery获取鼠标当前的坐标
			
文字来源:http://www.smalluv.com/jquery_code_106.html jQuery获取当前鼠标坐标位置: <div id="testDiv"> ...
 - [leetcode]_Valid Palindrome
			
题目:判断一个数字字符串是否是回文串.空串认为是回文串. 思路:双指针问题,重点在于此题的很多陷进:例如,s = " " ,return true. s = ".,&qu ...
 - JMeter2.13 连接 sql server
			
1.安装驱动 http://www.microsoft.com/zh-CN/download/details.aspx?id=11774 下载最新的即可 解压后复制势穷力竭sqljdbc.jar到 “ ...
 - Sublime Text  快捷键
			
ctrl+shift+t:重新打开最近关闭文件 快捷键 功能 ctrl+shift+n 打开新Sublime ctrl+shift+w 关闭Sublime,关闭所有打开文件 ctrl+shift+t ...
 - 最近的学习的linux命令笔记
			
vmstat 2 2 mail -s nihao root < test.txt f 323 h 300-310 crontab -l,-e,-r vim /etc/cron ...
 - HBase分布式安装
			
安装HBase之前需要先安装Hadoop,因为HBase是运行在Hadoop集群上的.安装Hadoop可以参照http://www.cnblogs.com/stGeekpower/p/3307289. ...
 - EcShop二次开发系列教程–总纲
			
EcShop作为老牌的B2C独立网店系统,功能非常全名,强大的文件.数据库缓存机制,保证前后台系统执行速度更快.系统平稳运行.但是过多的功能也或多或少的会影响到系统的整个效率,所有在使用EcShop搭 ...
 - delphi 基础之三  编写和调用dll文件
			
delphi 编写和调用dll文件 Windows 的执行文件可以划分为两种形式程序和动态连接库 (DLLs).一般程序运行是用.EXE文件,但应用程序有时也可以调用存储在DLL的函数. 在如下几 ...
 - Python开发【第一篇】Python基础之生成器和迭代器
			
生成器和迭代器 1.生成器 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator):如果函数中包含yield语法,那这个函数就会变成生成器: def func(): yield 1 ...