Fork me on GitHub

90. Subsets II

90. Subsets II

题目

 Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).

Note: 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],
  []
]

解析

从前往后遍历,保留下当前已经计算好的组合集合。对当前i号元素的加入,就是有i和没有i的场景。没有i的场景就是已有的集合。有i的就是对已有的集合追加上i后的集合。两个的并集就是加入i之后的结果。
如果i和上一个元素是重复的,则只需要考虑i-1加入过集合的那部分子集。对于不包含i-1元素的场景来说,这部分子集加入i的结果集,和已有的加入过i-1的结果集是重复的。所有跳过这部分就可以了。


// 90. Subsets II
class Solution_90 {
public:

	void dfs(vector<vector<int>> &res,vector<int> &out,vector<int>&nums,int pos)
	{
		res.push_back(out);

		for (int i = pos; i < nums.size();i++)
		{
			out.push_back(nums[i]);
			dfs(res, out, nums, i + 1);
			out.pop_back();
			while ((i+1)<nums.size()&&nums[i+1]==nums[i])
			{
				i++;
			}
		}
		return;
	}

	vector<vector<int>> subsetsWithDup(vector<int>& nums) {

		vector<vector<int>> res;
		vector<int> out;
		if (nums.empty())
		{
			return res;
		}
		sort(nums.begin(),nums.end());

		dfs(res, out, nums, 0);

		return res;

	}
};

题目来源

posted @ 2018-04-12 20:51  ranjiewen  阅读(170)  评论(0编辑  收藏  举报