LeetCode 18.四数之和

LeetCode 18.四数之和 C++

思路🧐:

由题意得,四个数组里面的整数相加需要得到target这个目标值,且结果不能重复 ,那么我们可以用排序+双指针 的方式进行解答,将该数组变为升序数组 ,然后固定左边两个数,从第二个固定的数下一位开始创建一个left指针,数组结尾创建一个right指针。

创建好指针后,我们将target减去固定的两个数得到变量ret,这样只需要考虑两个指针相加是否等于ret。

此时两个指针相加有三种情况

  1. left+right>ret,数组升序,那么left往右所有数与right相加都大于ret,则需要right--
  2. left+right<ret,数组升序,那么right往左所有数与left相加都小于ret,则需要left++
  3. left+right==ret,表示找到了,记录四元组,left++和right--。此时需要考虑去重问题,当left++值与left一样,则继续++,当right--与right值一样,则继续--。

当left>right时,该次循环结束,找到了固定最左边两数的四元组,接下来第二个固定的数++,并判断是否一样,一样就继续++,然后继续双指针遍历,直到第二个固定的数走完数组,就该第一个固定的数开始++和去重,反复循环,直到第一个固定的数遍历完数组。

代码🔎:

c++ 复制代码
class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        sort(nums.begin(),nums.end());
        int n = nums.size();
        vector<vector<int>> fourV;
        for(int i = 0; i < n;) //固定第一个数
        {
            for(int j = i + 1; j < n;) //固定第二个数
            {
                int left = j + 1;
                int right = nums.size() - 1;
                long long ret = (long long)target - nums[i] - nums[j]; //防止int溢出,所以用longlong
                while(left < right)
                {
                    if(nums[left] + nums[right] > ret) //>ret,right--
                        right--;
                    else if(nums[left] + nums[right] < ret) //<ret,left++
                        left++;
                    else
                    {
                        fourV.push_back({nums[left],nums[right],nums[i],nums[j]});
                        left++;
                        right--;
                        while(left < right && nums[left - 1] == nums[left]) //去重
                            left++;
                        while(left < right && nums[right + 1] == nums[right])
                            right--;
                    }
                }
                //固定数去重,这里防止漏判,所以先++
                j++;
                while(j < n && nums[j] == nums[j - 1])
                    j++;
            }
            i++;
            while(i < n && nums[i] == nums[i - 1])
                i++;
        }
        return fourV;
    }
};

时间复杂度:O (N 2LogN) 空间复杂度:O(N)

相关推荐
大千AI助手2 分钟前
Householder变换:线性代数中的镜像反射器
人工智能·线性代数·算法·决策树·机器学习·qr分解·householder算法
Yeniden5 分钟前
设计模式>原型模式大白话讲解:就像复印机,拿个原件一复印,就得到一模一样的新东西
java·设计模式·原型模式·1024程序员节
Mr.H012713 分钟前
迪杰斯特拉(dijkstra)算法
算法
给大佬递杯卡布奇诺33 分钟前
FFmpeg 基本数据结构 AVPacket分析
数据结构·c++·ffmpeg·音视频
南方的狮子先生39 分钟前
【数据结构】从线性表到排序算法详解
开发语言·数据结构·c++·算法·排序算法·1024程序员节
派大星爱吃猫1 小时前
快速排序和交换排序详解(含三路划分)
算法·排序算法·快速排序·三路划分
焜昱错眩..1 小时前
代码随想录第四十八天|1143.最长公共子序列 1035.不相交的线 53. 最大子序和 392.判断子序列
算法·动态规划
程序猿编码1 小时前
Linux 文件变动监控工具:原理、设计与实用指南(C/C++代码实现)
linux·c语言·c++·深度学习·inotify
AI妈妈手把手1 小时前
YOLO V2全面解析:更快、更准、更强大的目标检测算法
人工智能·算法·yolo·目标检测·计算机视觉·yolo v2
极客智造1 小时前
编程世界的内在逻辑:深入探索数据结构、算法复杂度与抽象数据类型
数据结构·算法·数学建模