美文网首页
Ksum 问题

Ksum 问题

作者: stepsma | 来源:发表于2016-12-24 08:20 被阅读0次

Ksum,用backtracking来做,转换成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;
    }
};

相关文章

  • Ksum 问题

    Ksum,用backtracking来做,转换成1sum or 2sum, 3Sum: https://leetc...

  • Leetcode kSum问题

    kSum 泛指一类问题,例如 leetcode 第1题 2 Sum,leetcode 第15题 3 Sum,lee...

  • leetcode 18. 4Sum

    leetcode 18. 4Sum 题目,但是其解题思路可以延伸到 ksum 参考:1 ksum

  • [Leetcode][求和问题2Sum, 3Sum, 4Sum,

    K-SUM解题思路 本总结参考:博客,Sigmainfy,Ksum整理 求和问题描述(K sum problem)...

  • k数和

    def kSum(self, A, k, target):n = len(A)if n <= 0 or k <= ...

  • 1. & 15. K-sum 问题

    Ksum问题: 第一种方法:暴力法,遍历 K 轮,求几个数字的和就遍历几轮。但是由于每遍历一轮都需要 的时间复杂...

  • kSum总结,两指针线性扫

    Two Sum: 题目: 给定数组返回两个数之和为target的所有组合,每个数只能用一次思路1:hash tab...

  • 字节KSUM一道你不知道的算法题

    一.前言 文章主要给大家分享一个字节跳动自己出的算法题目--KSUM。作者学习了很多,但是没有能够很好的解决这个问...

  • 问题,不是问题;问题,还是问题

    问题,不是问题 今天,是到新校舍的第一天。没水没电没床铺,教室里连黑板都没有。面对诸多问题,幸运的是...

  • 问题问题还是问题?

    问题实在是太多了!菜要这样做,不这样做是问题;饭没煮好,也是问题;自己不知道学会搞吃的也是问题;生活好像只剩下无尽...

网友评论

      本文标题:Ksum 问题

      本文链接:https://www.haomeiwen.com/subject/baslvttx.html