Ksum 問題

Ksum,用backtracking來做,轉(zhuǎn)換成1sum or 2sum,

3Sum: https://leetcode.com/problems/3sum/description/

4Sum: https://leetcode.com/problems/4sum/description/

class Solution {
public:
    
    void find1Sum(vector<vector<int>> &allcomb, vector<int> &comb, vector<int>& nums, int target, int start){
        for(int i=start; i<nums.size(); i++){
            if(nums[i] == target){
                comb.push_back(nums[i]);
                allcomb.push_back(comb);
                comb.pop_back();
            }
        }
    }
    
    void find2Sum(vector<vector<int>> &allcomb, vector<int> &comb, vector<int>& nums, int target, int start){
        int left = start, right = nums.size()-1;
        while(left < right){
            int sum = nums[left] + nums[right];
            if(sum == target){
                comb.push_back(nums[left]);
                comb.push_back(nums[right]);
                allcomb.push_back(comb);
                comb.pop_back();
                comb.pop_back();
                left++; right--;
                while(nums[left] == nums[left-1]) left++;
                while(nums[right] == nums[right+1]) right--;
            }
            else if(sum < target){
                left++;
            }
            else{
                right--;
            }
        }
    }
    
    void find4Sum(vector<vector<int>> &allcomb, vector<int> &comb, vector<int>& nums, int target, int start, int k){
        if(k <= 0){
            return;
        }
        
        else if(k == 1){
            find1Sum(allcomb, comb, nums, start, target);
            return;
        }
        else if(k == 2){
            find2Sum(allcomb, comb, nums, target, start);
            return;
        }
        
        for(int i=start; i<=nums.size()-k; i++){
            if(i > start && nums[i] == nums[i-1]){
                continue;
            }
            
            comb.push_back(nums[i]);
            find4Sum(allcomb, comb, nums, target-nums[i], i+1, k-1);
            comb.pop_back();
        }
    }
    
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        vector<vector<int>> allcomb;
        if(nums.size() < 4){
            return allcomb;
        }
        
        vector<int> comb;
        sort(nums.begin(), nums.end());
        find4Sum(allcomb, comb, nums, target, 0, 4);
        return allcomb;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗。 張土汪:刷leetcod...
    土汪閱讀 12,891評論 0 33
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,525評論 19 139
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實...
    香橙柚子閱讀 24,712評論 8 183
  • 因為想把內(nèi)外再做進(jìn)一步的發(fā)散,所以這次的導(dǎo)圖自己做了一些變化,用兩個小導(dǎo)圖的形式在旁邊做了發(fā)散,然后結(jié)合這個導(dǎo)圖...
    小學(xué)生計劃閱讀 284評論 0 0
  • 你是否還記得,第一次獨自背著書包,走進(jìn)教室的情景; 你是否明白,第一次孤身一人離開家鄉(xiāng)告訴自己的話; 你是否想起,...
    胡文璟閱讀 312評論 2 3

友情鏈接更多精彩內(nèi)容