#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],布布扣,bubuko.com
LeetCode_39combinationSum2 [Combination Sum II]
原文:http://my.oschina.net/ITHaozi/blog/293181