LeetCode Combination Sum II

题意

Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
Each number in C may only be used once in the combination.
给定一个数组和一个目标值,求出所有加起来的和等于这个目标值的组合,数组里有重复的元素,一个元素只可以用一次

解法

这题是Combination Sum的加强版,思路和它很像,只不过麻烦的是上一题里数组是没有重复元素的,但是这题有,所以先排序,然后得出答案后哈希判重。

class Solution
{
	vector<vector<int>>	ans;
	map<unsigned int,bool>	hash;

public:
	vector<vector<int>> combinationSum2(vector<int>& candidates, int target)
	{
		ans.clear();
		hash.clear();
		vector<int>	temp;

		sort(candidates.begin(),candidates.end());

		dfs(0,0,candidates,target,temp);
		return	ans;
	}

	void	dfs(int k,int sum,vector<int>& candidates, int target,vector<int> temp)
	{
		if(sum == target)
		{
			unsigned int seed = 131;
			unsigned int result = 0;
			for(int i = 0;i < temp.size();i ++)
				result = result * seed + temp[i];
			result = result & 0x7fffffff;

			if(hash.find(result) == hash.end())
			{
				ans.push_back(temp);
				hash[result] = true;
			}
		}

		for(int i = k;i < candidates.size();i ++)
			if(sum + candidates[i] <= target)
			{
				temp.push_back(candidates[i]);
				dfs(i + 1,sum + candidates[i],candidates,target,temp);
				temp.pop_back();
			}
	}
};
posted @ 2016-09-21 13:56  Decouple  阅读(202)  评论(0编辑  收藏  举报