力扣(LeetCode)18. 四数之和(C++)

news2025/7/18 5:39:07

双指针

快排使 n u m s nums nums 正序。

设置四个指针 i i i 指向 n u m s nums nums 第一个数, j j j 指向 n u m s nums nums 第二个数,从前往后枚举 n u m s [ i ] nums[i] nums[i] n u m s [ j ] nums[j] nums[j] l l l n u m s [ j + 1 ] nums[j+1] nums[j+1] 往后,指向第三个数, r r r n u m s . s i z e ( ) − 1 nums.size()-1 nums.size()1 往左,指向第四个数。

设四数之和 n u m s [ i ] + n u m s [ j ] + n u m s [ l ] + n u m s [ r ] = s u m nums[i]+nums[j]+nums[l]+nums[r]=sum nums[i]+nums[j]+nums[l]+nums[r]=sum ,如果 s u m > t a r g e t sum>target sum>target ,为了接近 t a r g e t target target r − − r-- r 。 同理, s u m < t a r g e t sum<target sum<target , 为了接近 t a r g e t target target l + + l++ l++

如果 s u m = t a r g e t sum=target sum=target 得到一个答案,为了避免重复答案, l l l 循环右移,直到遇到不重复元素,同理 r r r 循环左移 。

代码展示

class Solution {
public:
    vector<vector<int>> fourSum(vector<int>& nums, int target) {
        int n = nums.size();
        vector<vector<int>> ans;
        if(nums.size()<4) return ans;
        sort(nums.begin(),nums.end());
        for(int i = 0;i<n-3;i++){
            if(i&&nums[i]==nums[i-1]) continue;
            for(int j = i+1;j<n-2;j++){
                if(j!=i+1&&nums[j]==nums[j-1]) continue;
                int l = j+1,r = n - 1;
                while(l<r){
                    long long sum = (long long)nums[i]+nums[j]+nums[l]+nums[r];
                    if(sum>target) r--;
                    else if(sum<target) l++;
                    else{
                        ans.push_back({nums[i],nums[j],nums[l],nums[r]});
                        while(l<r&&nums[l]==nums[l+1]) l++;
                        while(l<r&&nums[r]==nums[r-1]) r--;
                        l++;
                        r--;
                    }
                }
            }
        }
        return ans;
    }
};

博主致语

理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。

AC

AC

复杂度分析

  1. 时间复杂度: O ( n 3 ) O(n^3) O(n3) n n n n u m s nums nums 的长度 , 枚举 n u m s [ i ] nums[i] nums[i] n u m s [ j ] nums[j] nums[j] ,同时双指针枚举 n u m s [ l ] / n u m s [ r ] nums[l]/nums[r] nums[l]/nums[r] 的时间复杂度 O ( n 3 ) O(n^3) O(n3)
  2. 空间复杂度: O ( l o g n ) O(logn) O(logn),快排的平均空间复杂度 O ( l o g n ) O(logn) O(logn)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/18588.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI写作文案的技巧:Wordhero AI写作SOP

文案引用自AI Content Hacker Tips 7步成文&#xff1a;2000单词SEO文案写作 | Wordhero AI Editor大更新心态&#xff1a;用AI写作的正确态度 人工智能 (AI) 的兴起导致写作世界发生了一些有趣的变化。许多人现在正在使用人工智能工具来帮助他们写作。一些专家认为&#xff0…

向毕业妥协系列之深度学习笔记(一)浅层神经网络

目录 一.神经网络杂记 二.计算图&#xff08;反向传播求导的几个实例&#xff09; 1.普通式子反向传播求导 2.逻辑回归中的梯度下降 3.m个样本的梯度下降 三.向量化 四.python广播 五.激活函数 六.随机初始化 深度学习系列的文章也可以结合下面的笔记来看&#xff1a;…

java计算机毕业设计装修设计管理系统设计与实现(附源码、数据库)

java计算机毕业设计装修设计管理系统设计与实现&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xf…

【论文阅读】时序动作检测系列论文精读(2020年)

文章目录1. DBG: Fast Learning of Temporal Action Proposal via Dense Boundary Generator论文目的——拟解决问题、贡献——创新实现流程详细方法2. PBR-Net: Progressive Boundary Refinement Network for Temporal Action Detection论文目的——拟解决问题贡献——创新实现…

08.初级指针

一、指针 指针理解的2个要点&#xff1a; 1. 指针是内存中一个最小单元的编号&#xff0c;也就是地址 2. 平时口语中说的指针&#xff0c;通常指的是指针变量&#xff0c;是用来存放内存地址的变量 总结&#xff1a;指针就是地址&#xff0c;口语中说的指针通常指的是指针变…

VLSI 半定制设计方法 与 全定制设计方法【VLSI】

VLSI 半定制设计方法 与 全定制设计方法【VLSI】VLSI 半定制设计方法1. standard cell 设计方法Standard Cell library设计方法与步骤特点2. 门阵列(gate array)设计方法gate array特点与FPGA的区别PLA3. 门海设计方法(sea-of-gates styles)全定制&#xff1a;无约束设计方法&a…

希望计算机专业同学都知道这些老师

C语言教程——翁凯老师、赫斌 翁恺老师是土生土长的浙大码农&#xff0c;从本科到博士都毕业于浙大计算机系&#xff0c;后来留校教书&#xff0c;一教就是20多年。 翁恺老师的c语言课程非常好&#xff0c;讲解特别有趣&#xff0c;很适合初学者学习。 郝斌老师的思路是以初学…

【UML】活动图Activity Diagram、状态机图State Machine Diagram、顺序图Sequence Diagram

一、活动图 1、简述 活动图和流程图很相似&#xff0c;但是流程图不属于UML图的一种。 类图是一种静态图&#xff0c;属于结构建模&#xff1b;活动图是一个动态图&#xff0c;属于行为建模。 2、元素 2.1 开始、结束、判读、活动、合并 流程图的元素很简单&#xff1a;圆…

[附源码]java毕业设计社区新冠疫情防控网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

WebSocket 和 Socket 的区别

WebSocket 和 Socket 的区别就像Java和JavaScript&#xff0c;并没有什么太大的关系&#xff0c;但又不能说完全没关系。可以这么说&#xff1a; 1.命名方面&#xff0c;Socket是一个深入人心的概念&#xff0c;WebSocket借用了这一概念&#xff1b;2.使用方面&#xff0c;完全…

java项目-第148期ssm社区疫情防控管理信息系统-ssm毕业设计_计算机毕业设计

java项目-第148期ssm社区疫情防控管理信息系统-ssm毕业设计_计算机毕业设计 【源码请到资源专栏下载】 今天分享的项目是《ssm社区疫情防控管理信息系统》 该项目分为2个角色&#xff0c;管理员、用户。 用户可以浏览前台的疫情物资&#xff0c;进行申请领取。申请后可以在后台…

Windows Server 2019 - 辅助DNS

配置辅助DNS实现主DNS的备用 两台虚拟机;都安装了DNS服务器 一个作为主服务器,一个作为备用服务器 主服务器的配置: 固定IP DNS管理器 安装成功后打开DNS管理器 在正向查找区域新建区域

尝试搞懂 MySQL(一)

一、MySQL 基础架构 先上个 MySQL 逻辑架构图 可以看出&#xff0c;整个架构分为两层&#xff1a;server 层 和 存储引擎层。其中&#xff1a; server 层&#xff1a;连接器、查询缓存、分析器、优化器、执行器等&#xff1b;存储引擎层&#xff1a;插件式&#xff0c;支持 In…

与排序相关的STL模板

今天,深度学习了排序的我决定大展身手,将另我突发八十年脑血栓的STL排序全部列举出来. 本博客除了已在文章中说明的函数外,其他默认头文件为<algorithm>. qsort 在c标准库中,此函数被(收藏)于<cstdlib> qsort 与 bsearch 的比较函数 qsort 函数有四个参数&…

华清远见上海中心22071班--11.19作业

题目&#xff1a;实现开发板点灯操作 程序要求&#xff1a; 1&#xff09;分部实现注册字符设备驱动 2&#xff09;自动创建设备节点 3&#xff09;通过结构体对led灯地址进行映射 4&#xff09;次设备号完成私有数据传参 5&#xff09;在open函数中获取到次设备号&#xff0c…

Js逆向教程-10常见代码混淆

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; Js逆向教程-10常见代码混淆 一、常见代码混淆 eval混淆AA和OO混淆JSFuck 混淆就是将正常的代码进行语法上的改变或者变量名称上的改变…

基于javaweb,ssm学生宿舍系统(带论文)

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat8.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;非前后端分离 前端技术&#xff1a;vue.jselementUI等框架实现 服务端技术&#xff1a;springspringmvcmybat…

基于stm32单片机的输入捕获测量脉宽Proteus仿真

资料编号&#xff1a;109 下面是相关功能视频演示&#xff1a; 109-基于stm32的输入捕获测量脉宽Proteus仿真(源码仿真全套资料)功能介绍&#xff1a; 采用stm32单片机作为主控&#xff0c;采用单片机的GPIO进行输入捕获&#xff0c;可以测量按键按下的低电平脉宽时间&#x…

云原生系列七【轻松入门容器基础操作】

✅作者简介&#xff1a; CSDN内容合伙人&#xff0c;全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;华为云享专家博主&#xff0c;掘金后端评审团成员 &#x1f495;前言&#xff1a; 最近云原生领域热火朝天&#xff0c;那么云原生是什么&#xff1f;何为云原生&a…

驱动——串口工具点灯实验

通过串口工具输入命令&#xff0c;操作LED灯的点亮与熄灭 要求&#xff1a; 1&#xff09;分部实现注册字符设备驱动 2&#xff09;自动创建设备节点 3&#xff09;通过结构体对led灯地址进行映射 4&#xff09;次设备号完成私有数据传参 代码实现&#xff1a; 1、头文件…