leetcode 40. Combination Sum II

来源:互联网 发布:视频剪辑制作软件电脑 编辑:程序博客网 时间:2024/06/15 09:07

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;    }};