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

news2024/11/15 23:49:40

在这里插入图片描述

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

目录

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


一、前言

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

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

在这里插入图片描述

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

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

1、定义

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

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

在这里插入图片描述

2、回文检查

【题目描述】 给定一个长度为 n 的字符串 S。请你判断字符串S 是否回文。
【输出描述】 输入仅1行包含一个字符串S。 1 ≤ S ≤ 1 0 6 1≤ S≤10^6 1S106,保证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、美丽的区间

【题目描述】 给定一个长度为 n n n的序列 a 1 , a 2 , ⋅ ⋅ , a n a_1,a_2,··,a_n a1,a2,,an和一个常数 S。对于一个连续区间如果它的区间和大于或等于 S ,则称它为美丽的区间。对于一个美丽的区间,如果其区间长度越短,它就越美丽。请你从序列中找出最美丽的区间。
【输入描述】 第一行包含两个整数,S,其含义如题所述。接下来一行包含几个整数,分别表示 a 1 , a 2 , ⋅ ⋅ , a n a_1,a_2,··,a_n a1,a2,,an
10 ≤ N ≤ 1 0 5 , 1 ≤ a i ≤ 1 0 4 , 1 ≤ S ≤ 1 0 8 10≤N≤10^5,1≤a_i≤10^4,1≤S≤10^8 10N105,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;
	else
		cout << ans;         
	return 0;
}

在这里插入图片描述

四、后记

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

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

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

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

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

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

相关文章

将字符串代码编译为字节代码对象 compile()

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】将字符串代码编译为字节代码对象compile()[太阳]选择题关于以下python代码表述错误的一项是?sx1y2print("xy",xy)print("【显示】s&#xff1a;")print(s)print("【执…

fpga实操训练(一个典型的fpga系统)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 对于刚学习fpga的同学来说,很多人可能一开始并不了解,一个典型的fpga系统应该是什么样子的。今天正好来熟悉一下。此外,我们也可以通过这个系统,从另外一个角度学习下,为什么要…

【蓝桥杯】简单数论——快速幂矩阵快速幂

1、快速幂 1.1运算模 定义&#xff1a;模运算为a除以m的余数&#xff0c;记为a mod m&#xff0c;有a mod m a % m。 模运算是大数运算中的常用操作&#xff1a;如果一个数太大&#xff0c;无法直接输出&#xff0c;或者不需要直接输出&#xff0c;可以把它取模后&#xff…

2.4总线操作和定时

文章目录一、引子二、介绍1.总线周期2.总线定时规范三、同步定时方式1.过程2.特点3.优缺点①优点②缺点四、异步定时方式1.介绍2.三种方式&#xff08;1&#xff09;不互锁方式&#xff08;2&#xff09;半互锁方式&#xff08;3&#xff09;全互锁方式3.优缺点①优点②缺点五、…

Allegro如何统计包含过孔长度的网络长度操作指导

Allegro如何统计包含过孔长度的网络长度操作指导 当需要统计网络长度的时候,可以通过element选择nets看到网络的长度,但是当网络换层了,并且需要统计到过孔的长度,类似下图 Allegro可以快速的统计网络的长度,并且包含过孔的长度 具体操作如下 选择Setup选择Constraint –…

设计模式 - 六大设计原则之SRP(单一职责)

文章目录概述CaseBad ImplBetter Impl1. 定义接口2. 职责分离-多种实现类3. 单元测试小结概述 单一职责原则&#xff08;Single Responsibility Principle&#xff0c; SRP&#xff09;又称单一功能原则&#xff0c;是面向对象的五个基本原则&#xff08;SOLID&#xff09;之一…

2022这一年

前言 一年过得好快啊&#xff0c;这个年终总结不知道该写点啥&#xff0c;所以一直到现在也没动笔。 但如果不写吧&#xff0c;总感觉少了点什么。就像过年守夜&#xff0c;反正我是每年都要等到凌晨12点放完鞭炮后才睡。 前些天也看到不少博主发布了2022年终总结&#xff0c;…

【ARM体系结构】之相关概念与公司简介

1、ARM相关的概念 机器码&#xff1a;计算机可以识别的0和1的组合。即高低电平的信号&#xff0c;1高电平信号&#xff0c;0低电平信号 汇编指令&#xff1a;编译器可以将汇编指令&#xff08;存在代码段&#xff09;编译成为机器码&#xff0c;执行汇编指令可以完成相应的汇编…

【进击的算法】基础算法——动态规划

&#x1f37f;本文主题&#xff1a;动态规划 &#x1f388;更多算法&#xff1a;回溯算法 &#x1f495;我的主页&#xff1a;蓝色学者的主页 文章目录一、前言二、概念2.1概念一&#xff1a;状态转移2.2概念二&#xff1a;Dp数组三、例题3.1斐波那契数列3.1.1题目描述3.1.2状态…

JQUERY总结(四)

对象拷贝&#xff1a; <script src"jQuery.min.js"></script> <script>$(function(){// var targetObj{};// var obj{// id:0,// name:"xinyi",// location:"henan"// };// //覆盖以前的相同key值对应的数据// $.…

【自然语言处理】基于NLP的电影评论情感分析模型比较

基于NLP的电影评论情感分析模型比较一段时间以来&#xff0c;使用机器学习的 NLP 任务借助 BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;模型被认为是当前的黄金标准。这些模型通常用于我们日常的许多语言处理任务&#xff0c;比如谷…

Java面试题,线程安全问题

线程安全问题一、对线程安全的理解&#xff08;实际上是内存安全&#xff09;二、Thread类的继承、Runable接口的重写三、守护线程四、ThreadLocal原理和使用场景五、sleep、wait、join、yield六、线程池、解释线程池参数一、对线程安全的理解&#xff08;实际上是内存安全&…

JVM面试一

5. JVM 5.1 JVM包含哪几部分? 参考答案 JVM 主要由四大部分组成:ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎),Native Interface(本地库接口),下图可以大致描述 JVM 的结构。 JVM 是执行 Java 程序的虚拟计算…

【计算机组成原理】第一章 计算机系统概述

文章目录第一章 知识体系1.1 计算机发展历程1.1.1 计算机硬件的发展1.1.2 计算机软件的发展1.2 计算机系统层次结构1.2.1 计算机系统的组成1.2.2 计算机硬件1.2.3 计算机软件1.2.4 计算机的层次结构1.2.5 计算机系统的工作原理1.3 计算机的性能指标第一章 知识体系 1.1 计算机发…

35.Isaac教程--机械臂取放物体示例应用程序

机械臂取放物体示例应用程序 ISAAC教程合集地址文章目录机械臂取放物体示例应用程序使用 Omniverse 套件模拟驱动的机器人手臂启动取放示例应用程序该包为拾取和放置场景提供了一个应用程序脚手架。 它具有执行拾取和放置任务所需的高级步骤&#xff0c;并与两种类型的机器人操…

Java面试题,Spring与SpringBoot相关问题

Spring与SpringBoot相关问题1、BeanFactory和ApplicationContext有什么区别&#xff1f;2、描述一下Spring Bean的生命周期3、Spring的几种Bean的作用域4、单例Bean是线程安全的吗&#xff1f;5、Spring框架用到了哪些设计模式6、Spring事务的实现方式、隔离级别、传播行为7、S…

Lesson4--栈和队列

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 初始化栈 销毁栈 栈的扩容 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 判空 程序代码如下 Stack.h Stack.c test.c 2.队列 2.1队列的概念及结构 ​2.2队列的实现 初始化队列 队尾入队列 队头出队列 获取队列头部元素 获取…

二、pyhon基础语法篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 一 、print 1. end 2. \t对齐 二、字面量 1. 字面量的含义 2. 常见的字面量类型 3. 如何基于print语句完成各类字面量的输出 三、 注释的分类 1. 单行注释 2. 多行注释 3. 注释的…

多进程|基于非阻塞调用的轮询检测方案|进程等待|重新理解挂起|Linux OS

说在前面 今天给大家带来操作系统中进程等待的概念&#xff0c;我们学习的操作系统是Linux操作系统。 我们今天主要的目标就是认识wait和waitpid这两个系统调用。 前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cbl…

nacos源码分析==服务订阅-服务端推送被订阅者最新信息给订阅者

上一篇讲到客户端发送请求到服务端进行服务注册&#xff0c;注册后&#xff0c;服务端会发出两个事件&#xff0c;第一个事件会触发另一个ServiceChangedEvent&#xff0c;这个事件被com.alibaba.nacos.naming.push.v2.NamingSubscriberServiceV2Impl#onEvent 监听&#xff0c…