leetcode 40. Combination Sum II
class Solution {
public:
vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
vector<vector<int>> result;
vector<vector<int>> tempResult = {};
vector<int> temp = {};
if (candidates.size() < 1) {
return result;
}
sort(candidates.begin(), candidates.end());
int i = candidates.size() - 1;
while (i >= 0) {
temp.clear();
if (target == candidates[i]) {
while ( i >= 1 && target == candidates[i-1]) {
i--;
}
temp.push_back(target);
result.push_back(temp);
i--;
continue;
}
if (i >= 1) {
tempResult = combinationRangeSum(candidates, target - candidates[i], i - 1);
if (tempResult.size()>0) {
for (int j = 0; j < tempResult.size(); j++) {
tempResult[j].push_back(candidates[i]);
result.push_back(tempResult[j]);
}
}
}
i--;
}
map<string,bool> resultMap;
string tempNew;
map<string,bool>::iterator it;
vector<vector<int>> uniqueResult;
vector<int> tempNewResult = {};
for(int i = 0;i<result.size();i++){
tempNew = "";
tempNewResult = {};
for(int j = 0;j<result[i].size();j++){
tempNew += string(1,(result[i][j] + '0'))+"+";
tempNewResult.push_back(result[i][j]);
}
it = resultMap.find(tempNew);
if(it==resultMap.end()){
resultMap[tempNew] = true;
uniqueResult.push_back(tempNewResult);
}
}
return uniqueResult;
}
vector<vector<int>> combinationRangeSum(vector<int>& nums, int target, int right) {
double pos = binarySearchPos(nums, target, 0, right);
vector<vector<int>> result = {};
vector<vector<int>> tempResult = {};
vector<int> temp = {};
if (pos - floor(pos)<0.4) {
temp.push_back(nums[floor(pos)]);
result.push_back(temp);
}
int i = floor(pos);
if (i == -1 || ceil(i) == right + 1) return{};
while (i >= 1 && target == nums[i]) {
i--;
}
while (i >= 1) {
tempResult = combinationRangeSum(nums, target - nums[i], i - 1);
if (tempResult.size()>0) {
for (int j = 0; j < tempResult.size(); j++) {
tempResult[j].push_back(nums[i]);
result.push_back(tempResult[j]);
}
}
i--;
}
return result;
}
double binarySearchPos(vector<int>& nums1, double num, int start, int end) {
int left = start, right = end, medium = 0;
while (left<right) {
medium = left + (right - left) / 2;
if (nums1[medium] - num >0.4) {
right = medium;
}
else if (num - nums1[medium] >0.4) {
left = medium + 1;
}
else {
return medium;
}
}
double left1;
if (nums1[left] - num<0.4 && num - nums1[left] <0.4)
left1 = left;
else if (nums1[left] - num>0.4) {
left1 = left - 0.5;
}
else {
left1 = left + 0.5;
}
return left1;
}
};