Fork me on GitHub

40. Combination Sum II

40. 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.

Note:

    All numbers (including target) will be positive integers.
    The solution set must not contain duplicate combinations.

For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,
A solution set is:

[
  [1, 7],
  [1, 2, 5],
  [2, 6],
  [1, 1, 6]
]


解析

  • 这道题跟之前那道 Combination Sum 组合之和 本质没有区别,只需要改动一点点即可,之前那道题给定数组中的数字可以重复使用,而这道题不能重复使用,只需要在之前的基础上修改两个地方即可,首先在递归的for循环里加上if (i > start && num[i] == num[i - 1]) continue; 这样可以防止res中出现重复项,然后就在递归调用combinationSum2DFS里面的参数换成i+1,这样就不会重复使用数组中的数字了
// add 40. Combination Sum ii
class Solution_40 {
public:

	void dfs(vector<vector<int>> &vecs, vector<int> &vec, int i, int target, vector<int> &candidates)
	{
		if (target == 0)
		{
			vecs.push_back(vec);
			return;
		}
		if (target < 0)
		{
			return;
		}
		// 1 1 2 5 6 (1,1,6;1 2 5)
		for (int k = i; k < candidates.size(); k++)
		{
			if (k>i && candidates[k] == candidates[k - 1]) //k>0 bug
			{
				continue;
			}
			vec.push_back(candidates[k]);
			dfs(vecs, vec, k+1, target - candidates[k], candidates);
			vec.pop_back();
		}
		return;
	}

	// 默认有序
	vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
		vector<vector<int>> vecs;
		vector<int> vec;
		if (candidates.size() == 0)
		{
			return vecs;
		}
		sort(candidates.begin(), candidates.end());
		dfs(vecs, vec, 0, target, candidates);

		return vecs;
	}
};

题目来源

posted @ 2018-02-05 10:48  ranjiewen  阅读(141)  评论(0编辑  收藏  举报