LeetCode 4Sum

本文探讨了4Sum问题,即在一个整数数组中找到四个元素的组合,使其和等于目标值,并介绍了如何寻找所有不重复的四元组。文中提供了一个C++实现方案,采用排序与双指针技巧来高效解决该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

4Sum

Given an array S of n integers, are there elements abc, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target.

Note:

  • Elements in a quadruplet (a,b,c,d) must be in non-descending order. (ie, a ≤ b ≤ c ≤ d)
  • The solution set must not contain duplicate quadruplets.

    For example, given array S = {1 0 -1 0 -2 2}, and target = 0.

    A solution set is:
    (-1,  0, 0, 1)
    (-2, -1, 1, 2)
    (-2,  0, 0, 2)

Reference:

My Solutions:

class Solution {
public:

    class Mysum{
        public:
            int sum;
            int index[2];
            bool operator<(const Mysum& other)const{
                return sum<other.sum;
            }
            bool check(const Mysum& other)const{
                for(int i=0;i<2;++i){
                    for(int j=0;j<2;++j){
                        if(index[i]==other.index[j])
                            return false;
                    }
                }
                return true;
            }
    };

    vector<vector<int> > fourSum(vector<int> &num, int target) {
        // Start typing your C/C++ solution below
        // DO NOT write int main() function

        vector<Mysum> mysums;
        vector<vector<int> > result;
        sort(num.begin(),num.end());
        for(int i=0;i<num.size();++i){
            for(int j=i+1;j<num.size();++j){
                Mysum tmp;
                tmp.sum=num[i]+num[j];
                tmp.index[0]=i;
                tmp.index[1]=j;
                mysums.push_back(tmp);
            }
        }
        sort(mysums.begin(),mysums.end());
        
        for(int i=0;i<mysums.size();++i){
            Mysum tmp;
            tmp.sum=target-mysums[i].sum;
            vector<Mysum>::iterator low=lower_bound(mysums.begin()+i+1,mysums.end(),tmp);
            for(;low!=mysums.end()&&low->sum==tmp.sum;++low){
                if(mysums[i].check(*low)){
                    vector<int> r;
                    r.push_back(num[mysums[i].index[0]]);
                    r.push_back(num[mysums[i].index[1]]);
                    r.push_back(num[low->index[0]]);
                    r.push_back(num[low->index[1]]);
                    sort(r.begin(),r.end());
                    if(find(result.begin(),result.end(),r)==result.end()){
                        result.push_back(r);
                    }
                }    
            }
        }
        
        return result;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值