【经典算法】双指针(尺取法):爱,是双向奔赴,还是你追我赶?

news/2024/11/27 19:27:31/

在这里插入图片描述

  • 👑专栏内容:算法学习随笔
  • ⛪个人主页:子夜的星的主页
  • 💕座右铭:日拱一卒,功不唐捐

目录

  • 一、前言
  • 二、左右指针(双向奔赴)
    • 1、定义
    • 2、回文检查
  • 三、快慢指针(你追我赶)
    • 1、定义
    • 2、美丽的区间
  • 四、后记


一、前言

双指针法又称尺取法,顾名思义,在区间操作时,使用两个指针同时遍历区间,从而实现高效操作。两个指针,就像是一男一女,他们遍历区间的过程,又何尝不像是一对男女彼此追求爱情的过程呢?

接下来一起学习双指针的恋爱过程。

在这里插入图片描述

二、左右指针(双向奔赴)

我渴望能见你一面,但请你记得,我不会开口见你。这不是因为我骄傲,你知道我在你面前毫无骄傲可言,而是因为,唯有你也想见我的时候,我们见面才有意义。——《越洋情书》西蒙·波伏娃

1、定义

左右指针,顾名思义,指针i与指针j,一个在左边,一个在右边。
两个指针的遍历方向相反,一个指针i从左往右,一个指针j从右往左。最终它们会在中间相会。

左右指针认为:真正的爱是双向奔赴,不论双方的差距有多大,距离有多远,只要双向奔赴,最终必将走到一起 ~

在这里插入图片描述

2、回文检查

【题目描述】 给定一个长度为 n 的字符串 S。请你判断字符串S 是否回文。
【输出描述】 输入仅1行包含一个字符串S。1≤S≤1061≤ S≤10^61S106,保证S只包含大小写、字母。
【输出描述】 若字符串S为回文串,则输出 Y,否则输出 N
【参考样例】 输入:abcba 输出:Y

回文:正读和倒读意义相同的,称为“回文”

#include <iostream>
using namespace std;
int main()
{string s;   cin >> s;                  //(1)读取字符size_t n = s.size();       //(2)获取字符长度int i = 0; int j = n - 1;  //(3)双指针(一左一右)while (i < j)             {if (s[i] != s[j])  	 //(4)判断回文{cout << "N";    return 0;      	 //(5)结束程序}i++; j--;           //(6)移动指针}cout << "Y";return 0;
}

在这里插入图片描述
这道题不难,有很多种方法。但是双指针是用起来最爽的。通过这道题,我们也可以大致看出来这双向奔赴的爱情大致的模样。

	int i = 0;int j =n - 1;while (i < j)             {   check(i, j);  //检查题目条件i++; j--;    //移动指针,i从头到尾,j从尾到头}

三、快慢指针(你追我赶)

不要追求幸福,而要幸福地追求。过程中的享受与快乐才是我们的需求。

1、定义

快慢指针,顾名思义,指针i与指针j,在同一方向,但是指针i指针j的遍历速度不一样。恰恰是因为ij的速度不同,它们之间会产生一个大小可变的滑动窗口,而这个窗口,正是它们幸福的来源。

快慢指针认为:真正的爱恰恰是你追我赶时产生的窗口期,如果没有这种不断追赶的过程,爱将会变的无趣,这个就是爱的魅力 ~

在这里插入图片描述

2、美丽的区间

【题目描述】 给定一个长度为nnn的序列a1,a2,⋅⋅,ana_1,a_2,··,a_na1,a2,,an和一个常数 S。对于一个连续区间如果它的区间和大于或等于 S ,则称它为美丽的区间。对于一个美丽的区间,如果其区间长度越短,它就越美丽。请你从序列中找出最美丽的区间。
【输入描述】 第一行包含两个整数,S,其含义如题所述。接下来一行包含几个整数,分别表示a1,a2,⋅⋅,ana_1,a_2,··,a_na1,a2,,an
10≤N≤105,1≤ai≤104,1≤S≤10810≤N≤10^5,1≤a_i≤10^4,1≤S≤10^810N105,1ai104,1S108
【输出描述】 输出共一行,包含一个整数,表示最美丽的区间的长度。若不存在任何美丽的区间,则输出 0 。
【参考样例】
输入:

5 6
1 2 3 4 5

输出:

2
#include <iostream>
#include<algorithm>
using namespace std;
int a[101000];
int main()
{int n, s;cin >> n >> s;for (int i = 0; i < n; i++)cin >> a[i];int sum = 0, ans = 1e8;int i = 0, j = 0;while (i < n)    //遍历整个列表{ if (sum < s)   //若区间和小于s{sum += a[i]; //区间和一直加i++;         //i指针右移}else{ans = min(i - j, ans); //记录短的区间长度sum -= a[j];          //区间和减j++;                  //j指针右移}}if (ans == 1e8)         //答案不存在cout << 0;elsecout << ans;         return 0;
}

在这里插入图片描述

四、后记

1、当出现有序数组或者题目具有单调性(任意一个指针的增加,条件满足与否只会出现对或错这两种情况)时,应该优先想到使用左右指针来减少遍历的时间。

2、当出现前缀和、区间的时候,可以想到使用快慢指针。

注意:篇幅有限,本文只是介绍了双指针最基础的定义和最简单的题目,双指针很多题远比本文出现的题目难。大家可以点个关注,等有时间我再继续更。

📢📢📢📢📢📢
💗 你正在阅读 【子夜的星】 的 算法笔记
👍 阅读完毕,可以点点小手赞一下
🌻 发现错误,直接评论区中帮我指正吧


http://www.ppmy.cn/news/19052.html

相关文章

React源码之render过程中发生了什么?

理解JSX 对于我们直接书写jsx语法&#xff0c;我们的浏览器是不理解我们这种语法的&#xff0c;所以需要babel来去转义&#xff0c;那么可以通过plugin-transform-react-jsx来转译jsx语法&#xff0c;使得浏览器可以识别我们的Jsx语法&#xff0c;例如&#xff1a; <div&g…

Java面试题,JVM相关问题

JVM相关问题一 、JDK、JRE、JVM二、内存管理三、GC如何判断对象可以被回收&#xff08;这是JVM的基础&#xff09;一 、JDK、JRE、JVM JDK&#xff1a;Java Development Kit【Java开发工具】&#xff0c;提供给Java开发人员来使用的。JRE&#xff1a;Java Runtime Environment…

15 Java IO流(File类+IO流+字节流+字符流+字节编码)

IO流15.1 File类15.1.1 Flile15.1.2 FileFilter接口15.2 IO流15.2.1 概念15.2.2 流的分类15.2.2.1 按方向15.2.2.2 按单位15.2.2.3 按功能15.3 字节流【重点】15.3.1 字节抽象类15.3.2 文件字节流【重点】15.3.3 IO流细节15.3.4 字节缓冲流【重点】15.3.5 综合案例(文件拷贝)15…

LA@分块矩阵@初等变换@初等矩阵#逆矩阵计算@初等变换法

文章目录LA分块矩阵初等变换初等矩阵#逆矩阵计算初等变换法分块矩阵乘法逆例准对角矩阵转置矩阵的初等变换&#x1f388;等价矩阵行阶梯形矩阵&#x1f388;变换步骤行简化阶梯形矩阵最简矩阵等价标准形矩阵变换步骤小结初等矩阵初等矩阵的结论&#x1f388;小结逆矩阵计算初等…

学习记录669@项目管理之项目合同管理

有效合同原则 有效合同应具备以下特点: (1)签订合同的当事人应当具有相应的民事权利能力和民事行为能力。 (2)意思表示真实。 (3)不违反法律或社会公共利益 与有效合同相对应&#xff0c;需要避免无效合同。无效合同通常需具备下列任一情形: (1)一方以欺诈、胁迫的手段订立合…

Flutter 基础-下

一、shared_preferences shared_preferences 是一个本地数据缓存库&#xff08;类似 AsyncStorage&#xff09; https://pub.dev/packages/shared_preferences 使用步骤 在 pubsepc.yaml 中添加 shared_preferences 依赖安装依赖&#xff08;pub get | flutter packages get |…

JDBC快速入门,如何使用JDBC操作数据库?

文章目录1. 前言2. JDBC 概述2.1 概念2.2 优点3. JDBC 快速入门Java编程基础教程系列1. 前言 在 Java 开发中&#xff0c;使用 Java 语言操作数据库是非常重要的一部分&#xff0c;那么 Java 语言是如何操作数据库的呢&#xff1f;我们需要使用不同厂商的数据库时&#xff0c;…

sbt编程语言scala的构建工具配置及项目构建(附带网盘下载)

SBT简介 SBT 是 Scala 的构建工具&#xff0c;全称是 Simple Build Tool&#xff0c; 类似 Maven 或 Gradle。 Java可以用Maven快速构建项目&#xff0c;scala用SBT快速构建一个Scala项目。 sbt下载官网 百度网盘链接&#xff1a;https://pan.baidu.com/s/1eJkdWndZ0izcd3w…