详细介绍:四数之和_优选算法(C++)双指针法总结
网页直达:
https://leetcode.cn/problems/4sum
题目分析:
1.在数组里面选四个不重复的数求和==target.
2.其实算法就是和上一题的三数之和一样的.同样的要找到全部结果,需要去重.注意越界情况.
解法一:排序+暴力枚举+利用set去重.
效率低下,就不实现了
解法二:排序+双指针
1.依次固定一个数a
2.在a后面的区间内利用"三数之和"找到三个数,使这三个数等于target-a即可,而"三数之和"过程就是依次固定一个数b;在b后面的区间内,利用"双指针"找到两个数,使这两个数的和等于target-a-b即可.
细节同样是:
1.不重复
2.不遗漏
3.图像过程非常重要.
我们简单用图像说明几个过程和细节
去重:
双指针去重:
i去重:
j去重:
特殊越界:
代码实现:
无详解:
class Solution {
public:vector> fourSum(vector& nums, int target) {vector> ret;sort(nums.begin(),nums.end());int n=nums.size();if(n<4)return ret;for(int i=0;i0时才需要和前一个元素比较if(i > 0 &&nums[i]==nums[i-1]){continue;}for(int j=i+1;j i + 1&&nums[j]==nums[j-1]){continue;}long long sum=0;int left=j+1,right=n-1;while(lefttarget){right--;}else if(sum
详解:
class Solution {
public:vector> fourSum(vector& nums, int target) {vector> ret;sort(nums.begin(),nums.end());//排序int n=nums.size();if(n<4)return ret;//一定要能构成四元组for(int i=0;i0时才需要和前一个元素比较if(i > 0 &&nums[i]==nums[i-1])//i去重{continue;}for(int j=i+1;j i + 1&&nums[j]==nums[j-1])//j去重{continue;}long long sum=0;//大树防止溢出int left=j+1,right=n-1;//双指针确定其余两个数while(lefttarget){right--;}else if(sum
双指针法总结:
到这里我们双指针算法的基本用法已经介绍的差不多了.我们来做一些总结.
双指针法是一种高效的算法技巧,通过使用两个指针在数组或链表等数据结构上移动来解决问题,通常能将时间复杂度从 O (n²) 优化到 O (n) 或 O (n log n)。以下是双指针法的系统总结:
一、核心思想
- 利用两个指针在数据结构中移动,避免嵌套循环
- 通过指针的有序移动(同向或反向)减少不必要的计算
- 配合排序使用时,可高效处理查找、去重等场景
二、常见应用场景
两数之和 / 三数之和 / 四数之和
- 先排序,再用左右指针从两端向中间移动
- 左右指针根据当前和与目标值的比较调整移动方向
- 关键在于去重处理和边界条件判断
链表相关问题
- 快慢指针:判断链表是否有环、寻找链表中点
- 前后指针:反转链表、删除倒数第 n 个节点
数组遍历与修改
- 原地修改数组(如移除元素、移动零)
- 合并两个有序数组
- 滑动窗口问题(一种特殊的双指针)下一节就是滑动窗口问题.
字符串问题
- 反转字符串
- 判断回文串
- 最长回文子串
三、双指针类型
同向双指针
- 两个指针朝同一方向移动
- 快指针先行,慢指针滞后
- 应用:链表操作、滑动窗口、移除重复元素
反向双指针
- 两个指针从两端向中间移动
- 通常用于已排序的数组
- 应用:n 数之和问题、反转操作
快慢双指针
- 两个指针移动速度不同
- 快指针每次移动多步,慢指针每次移动一步
- 应用:链表环检测、寻找链表中点
四、典型代码框架
注意事项:
双指针法是解决数组和链表相关问题的利器,掌握其核心思想和常见应用场景,能有效提升算法解题能力。实际应用中需根据具体问题选择合适的双指针类型和移动策略。
- 反向双指针(n 数之和):
-
sort(arr.begin(), arr.end());
int left = 0, right = arr.size() - 1;
while (left < right) {int sum = arr[left] + arr[right];if (sum == target) {// 找到解left++;right--;} else if (sum < target) {left++;} else {right--;}
}
- 同向双指针(移除元素):
-
int slow = 0;
for (int fast = 0; fast < nums.size(); fast++) {if (nums[fast] != val) {nums[slow] = nums[fast];slow++;}
}
- 快慢指针(链表中点):
-
ListNode* slow = head;
ListNode* fast = head;
while (fast != nullptr && fast->next != nullptr) {slow = slow->next;fast = fast->next->next;
}
// slow指向链表中点
五、优势与注意事项
优势:
- 降低时间复杂度,提高效率
- 空间复杂度通常为 O (1),不需要额外空间
- 很多情况下需要先排序(如 n 数之和问题)
- 注意边界条件,避免数组越界
- 处理去重问题时要仔细设计判断条件
- 指针移动的逻辑要清晰明确
双指针法是解决数组和链表相关问题的利器,掌握其核心思想和常见应用场景,能有效提升算法解题能力。实际应用中需根据具体问题选择合适的双指针类型和移动策略。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/923882.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
网站建设 嘉定宣传片制作公司前景
内存操作命令 直接对DRAM进行读写的操作,uboot常用的内存操作命令有md,nm,mm,mw,cp和cmp. md命令: 显示内存值
# md
md - memory display
Usage:
md [.b, .w, .l, .q] address [# of objects]
b:1个字节 byte
w:2个字节 world
l:4个字节 long
of objects 以word 为单位的1…
《初等数论(第四版,北京大学出版社,潘承洞,潘承彪著)》阅读笔记+心得
I、整除理论
一、自然数与整数
这里的自然数定义和各种规律以及反证法的定义就不再赘述,我们从归纳法开始讲起。
1.归纳原理
归纳原理: 设 S 是 N 的一个子集,满足条件:
(i) \(1 \in S\)
(ii) \(n \in S\),那么有…
完整教程:Ansible Playbook
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
免费招聘的网站自己的网站什么做优化
我的施工之路Python 绘图入门这是施工系列第18篇,同时也进入到一个新的阶段:Python绘图篇。作为绘图模块的第一篇,与大家一起过过最基本的Python绘图原理。掌握基本的绘图原理很有必要,各个常用绘图库的原理基本都是相通的。所以了…
做企业云网站的企业邮箱丰都网站建设公司
Web页面中的特殊效果,如菜单效果,对话框效果都需要通过定位属性来实现。定位样式position属性可以控制元素的定位类型position属性值可以为sataic、fixed、absolute、relativeposition属性的语法结构- position:value;定位属性static默认值。没有定位&am…
深圳做分销网站的公司大学生心里健康网站设计与建设
深入理解Linux守护进程Linux服务器在启动时需要启动很多系统服务,它们向本地和网络用户提供了Linux的系统功能接口,直接面向应用程序和用户。提供这些服务的程序是由运行在后台的守护进程(daemons)来执行的。守护进程是生存期长的…
完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?
完整教程:Word和WPS文字中的自动编号和文字间距过大怎么办?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Cons…
没有网站怎样做外贸wordpress文章换行符
前面我们看到的代码都是顺序执行的,也就是先执行第一条语句,然后是第二条、第三条……一直到最后一条语句,这称为顺序结构。
但是对于很多情况,顺序结构的代码是远远不够的,这时我们就要使用判断语句即if else语句。 …
珠海哪里学网站开发拓者设计吧官网app
计算机专业毕业后大致的工作方向是软、硬、网、图 四大类 尤其以软件、网络为现今的首选 从岗位上分,又可以分为技术道路、营销道路两大方向 if 你选择作技术,then 从现在开始,牢记: 天道酬勤!!ÿ…
制作网站首先做的工作重庆网站排名优化教程
系统配置:Windows XP 32位R 3.1.1一、安装RMySQL:1,安装RTools并配置环境变量:我的电脑——属性——高级——环境变量,在系统变量一栏中选择PATH,点击编辑,在后面添加RTools的路径(如:D:\Rtools\bin;D:\Rtools\gcc-4.6.3\bin;D:\R…
做网站需要购买服务器吗wordpress 果酱小程序
13 集合
实现方法时,不同的数据结构会导致性能有很大差异。 13.1 集合接口
Java集合类库将接口(interface)与实现(implementation)分离。
可以使用接口类型存放集合的应用,一旦改变了想法,可…
NOIP2025模拟赛28
T1
T2
T3
T4\(\color{#52C41A} 普及+/提高\)
\(\color {#3498DB} 提高+/省选-\)
\(\color {#3498DB} 提高+/省选-\)
\(\color{#9D3DCF} 省选/NOI-\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68a2efb9c5d9c2f14c2…
markdown笔记文件批量打上时间戳
解决了给一个文件夹(包含子文件夹)下的所有.md文件在最前面添加时间戳。
例如`Typora 笔记迁移 Obsidian 图片链接处理.md`修改为`20251001-Typora 笔记迁移 Obsidian 图片链接处理`
打上时间戳的笔记能够更好配合笔…
微服务调整中心高可用设计:从踩坑到落地的实战指南(二)
微服务调整中心高可用设计:从踩坑到落地的实战指南(二)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…
NOIP2025模拟赛30
T1
T2
T3
T4\(\color{#52C41A} 普及+/提高\)
\(\color{#52C41A} 普及+/提高\)
\(\color{#9D3DCF} 省选/NOI-\)
\(\color{#9D3DCF} 省选/NOI-\)参赛网址:https://oj.33dai.cn/d/TYOI/contest/68abe2d6c5d9c2f14c2cd7d2…
制作一个网站的全过程wordpress 手机 图片不显示
入门数字设计的时候,跨时钟域的数据处理是绕不开的课题,特别是多比特数据跨时钟域时,都会采用异步FIFO的方法。
异步FIFO中涉及较多的考点这里记录几个以供大家参考。
1. 异步FIFO的空满判断分别在哪个域?
根据异步FIFO的结构&…
图文讲解k8s中Service、Selector、EndpointSlice的运行原理 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …