LeetCode_39combinationSum2 [Combination Sum II]

#pragma warning(disable:4996)

#include <Windows.h>
#include <tchar.h>
#include <cstdio>
#include <vector>
using namespace std;

/*
	submit time : 3
		1. Runtime Error
			Last executed input:	[5,3], 5
		2. Wrong Answer
			Input:	[2,2,2], 4
			Output:	[[2,2],[2,2]]
			Expected:	[[2,2]]
	request :
		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.
		Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
		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]
*/

//=================QuickSort===================
void Swap(int* data, int i, int j) {
	int temp = data[i];
	data[i] = data[j];
	data[j] = temp;
}

int findpivot(int* data, int i, int j) {
	return (i + j) >> 1;
}

int partition(int* data, int l, int r, int pivot) {
	while (l < r) {
		while (data[++l] < pivot);
		while (l<r && data[--r] > pivot);
		Swap(data, l, r);
	}

	return l;
}

void qsort(int* data, int i, int j) {
	if (j <= i) return;

	int pivotIndex = findpivot(data, i, j);
	Swap(data, pivotIndex, j);
	int k = partition(data, i - 1, j, data[j]);
	Swap(data, k, j);
	qsort(data, i, k - 1);
	qsort(data, k + 1, j);
}
//===================END=======================

void helpCombinationSum2(vector<vector<int> >& result, vector<int>& solution, int* pStart, int* pEnd, int* vernier, int target, bool choose) {
	if (target == 0) {
		result.push_back(solution);
		return;
	}
	if ((vernier <= pEnd && target < *vernier) || (vernier > pEnd))
		return;

	int currValue = *vernier;
	// ignore same number
	if (vernier > pStart && *vernier == *(vernier - 1)) {
		/*
			here "if" is the difference, if the same value number is not chosen,
				then do not choose it neither
		*/
		if (!choose)
			helpCombinationSum2(result, solution, pStart, pEnd, vernier + 1, target, false);
		else {
			helpCombinationSum2(result, solution, pStart, pEnd, vernier + 1, target, false);

			solution.push_back(*vernier);
			helpCombinationSum2(result, solution, pStart, pEnd, vernier + 1, target - *vernier, true);
			solution.pop_back();
		}
	}
	else {
		// does not include current value
		helpCombinationSum2(result, solution, pStart, pEnd, vernier + 1, target, false);

		// include current value
		solution.push_back(currValue);
		helpCombinationSum2(result, solution, pStart, pEnd, vernier + 1, target - currValue, true);
		solution.pop_back();
	}
}

vector<vector<int> > combinationSum2(vector<int> &num, int target) {
	vector<vector<int> > result;
	if (num.size() == 0)
		return result;

	int *vernier = &num[0], *pStart = &num[0];
	int length = num.size();
	int* lastNum = vernier + length - 1;

	// sort num
	qsort(vernier, 0, length - 1);

	vector<int> solution;
	helpCombinationSum2(result, solution, pStart, lastNum, vernier, target, false);

	return result;
}

//======================Test========================
void printVector(vector<int>& num) {
	vector<int>::iterator iter = num.begin();
	printf("[");
	for (; iter != num.end(); ++iter)
		printf("%d ", *iter);
	printf("]");
	printf("\n");
}

void Test() {
	//int data[] = { 10,1,2,7,6,1,5 };
	int data[] = { 2,2,2,2 };
	int target = 6;
	vector<int> candidates(data, data + sizeof(data) / sizeof(int));
	vector<vector<int> > result = combinationSum2(candidates, target);
	vector<vector<int> >::iterator iter = result.begin();
	for (; iter != result.end(); ++iter)
		printVector(*iter);
}

int _tmain(int argc, _TCHAR* argv[]) {
	Test();

	system("pause");
	return 0;
}

LeetCode_39combinationSum2 [Combination Sum II]

时间: 2024-10-14 23:09:51

LeetCode_39combinationSum2 [Combination Sum II]的相关文章

【leetcode】Combination Sum II

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 t

LeetCode: Combination Sum II 解题报告

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 ta

LeetCode: Combination Sum II [039]

[题目] 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

[LeetCode][JavaScript]Combination Sum II

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 t

LeetCode 040 Combination Sum II

题目要求: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 (includ

Combination Sum II leetcode java

题目: 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

040 Combination Sum II

040 Combination Sum II 这道题是 039 Combination Sum 的延伸, 稍作改动就好 class Solution: # @param {integer[]} candidates # @param {integer} target # @return {integer[][]} def combinationSum2(self, candidates, target): candidates.sort() ans = [] self.help(candidat

Combination Sum,Combination Sum II,Combination Sum III

39. Combination Sum Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T. The same repeated number may be chosen from C unlimited number of times. Note: All numbers (inc

leetcode第一刷_Combination Sum Combination Sum II

啊啊啊啊,好怀念这种用递归保存路径然后打印出来的题目啊,好久没遇到了. 分了两种,一种是可以重复使用数组中数字的,一种是每个数字只能用一次的.其实没有多大区别,第一种每次进入递归的时候都要从头开始尝试,第二种要找一个标记的数组,把已经用到过的排除掉,就像生成全排列时的做法一样.跟我一样用引用保存中间结果的话,要注意回退的情况.第二种回退时,要把用到的那个数也恢复为可用,就完全像全排列时做的一样.破例贴两个题的代码,因为他们是在是不值得用两片文章来写. class Solution { publi