#LC18:四数相加

就是在三数相加基础上再加一套循环遍历
但是每次都因为一些小错误提交失败,就很难受…

传送门

class Solution
{
public:
    vector<vector<int>> fourSum(vector<int> &nums, int target)
    {
        sort(nums.begin(), nums.end());
        vector<vector<int>> v;
        int n = nums.size();
        int p1 = 0, p2;
        int left, right, low, high;
        while (p1 < n&&n>=4)
        {
            
            while (p1 > 0 && p1 < n && nums[p1] == nums[p1 - 1])
                p1++;
            if (p1 >= n)
                break;
            p2 = p1 + 1;
            while (p2 < n)
            {
                while (p2 > 1 + p1 && p2 < n && nums[p2] == nums[p2 - 1] )
                    p2++;
                if (p2 >= n)
                    break;
                low = p2 + 1;
                high = n - 1;
                while (low < high)
                {
                    int t = nums[low] + nums[high];
                    int t1 = target - nums[p1] - nums[p2];
                    if (t < t1)
                        low++;
                    else if (t > t1)
                        high--;
                    else
                    {
                        v.push_back({nums[p1], nums[p2], nums[low], nums[high]});
                        left = nums[low];
                        right = nums[high];
                        low++;
                        high--;
                        while (low < high && nums[low] == left)
                            low++;
                        while (low < high && nums[high] == right)
                            high--;
                    }
                }
                p2++;
            }
            p1++;
        }
        return v;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值