双指针算法初阶

news2024/10/6 6:02:49

前言:首先,这是不是你所了解的双指针算法?

for (int i = 0; i < n; i++)
{
	for (int j = 0; j < n; j++)
	{
		...
	}
}

那你就要继续往下看了,双指针算法可不是简单的两层的for循环暴力,这并不能起到时间优化的作用。

那话不多说,我们马上开始~~~

 

目录

 

1.双指针思想

2.双指针思想的应用

2.1快慢指针​编辑

双指针思路模板

2.2左右指针

3.金句省身


1.双指针思想

严格来说,双指针不是一种具体算法,而是一种思想,类似于贪心思想,双指针的技巧主要分为两类:快慢指针和左右指针。所谓左右指针,就是两个指针相向而行或相背而行,而快慢指针就是两个指针同向行走但是一快一慢。类似的例子有很多,比如二分算法,快排和归并排序等都利用了双指针算法。

在数组和链表中都可以采用双指针算法,本文重点来讲解在数组条件下使用双指针算法。

回到我们开头给出的代码,

for (int i = 0; i < n; i++)
{
	for (int j = 0; j < n; j++)
	{
		...
	}
}

这是一个O(n^2)的算法,而我们如果采用双指针算法,可以将上面的算法优化到O(n),我们一起来看看如何实现的:

我们可以让第二个指针在某个特定的条件下移动的次数小于n次,那么我们的代码就可以变成:

for (int i = 0; i < n; i++)
{
	while(j<n&&check(i,j))j++;//
     ...
}

这样以来内外层每次循环的次数就会小于2*n,也就是复杂度就会下降到O(n)。

2.双指针思想的应用

2.1快慢指针

 乍一看题目比较简单,我们可以定义两个指针,第一个指向起点,第二个指向终点,判断这个区间,满足就更新最大值,否则就将起点移动到下一位,继续找终点,直到找完为止。

我们不难给出代码:这里我用的STL做的,主要用于判重

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int mp[maxn];//表示数字的出现次数
int n;

int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	int ans = 1;
	for (int i = 0; i < n; i++)
	{
		int j = i;
		while (mp[a[j]] < 1 && j < n)
		{
			mp[a[j]]++;
			j++;
		}
		//printf("%d %d\n", i, j);
		memset(mp, 0, sizeof(mp));
		ans = max(ans, j - i);
	}
	printf("%d\n", ans);
	return 0;
}

但是如果给我们十万个数据,代码就要TLE了,具体的原因可以看下面的图:

 所以我们果断采用第二种实现方式,还是采用第一种空间换时间的做法,我们开一个记录当前数字个数的数组,然后确定一个终点,并从[0,i](i设为终点)中从左侧选择起点j,如果此时选择的,就一定是由于起点导致出现了重复元素,我们就让起点向终点移动,至于为什么一定是起点的问题,因为我们的终点就是从0一点点枚举变大的,所以我们在枚举出第i个符合条件的起点时,第i-1个起点已经求出并涵盖在和第i个起点内,所以一定是区间最外层的节点导致重复现象的产生。

 

那么这里便给出代码,对应可以理解下:

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int mp[maxn];//表示数字的出现次数
int n;

int main()
{
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &a[i]);
	}
	int ans = 1;
	for (int i = 0,j=0; i < n; i++)//i指向终点,j指向起点
	{
		//首先终点要加入
		mp[a[i]]++;
		while (mp[a[i]] > 1 && j <= i) //只要是我们的a[i]出现的次数还大于1,就说明中间出现了至少一次终点的元素值,我们的起点j就需要找到这个点为止,这里由于i一定大于等于j,所以第二个条件可有可无
			--mp[a[j++]];//注意是先减再j++

		ans = max(ans, i - j + 1);
	}
	printf("%d\n", ans);
	return 0;
}

这里我们就总结给出双指针思想的一般模板思路:

双指针思路模板

for (int i = 0, j = 0; i < n; i++)
{
	//...前置条件
	while (j < i && check(j, i)) j++;//这可以将原O(n*n)的算法优化成O(n)
	
    ...//每道题目的具体逻辑

}

2.2左右指针

我们常见的二分法就是左右指针的经典应用,这里不在赘述,详见:http://t.csdn.cn/LWFvP

3.金句省身

        你一定要狠下心来努力,努力变成一个很厉害的人,没有必要让别人知道你的计划,退出不合适的圈子和不合适的人,断开不如意的感情,做最真实的自己。要成为那种不声不响,却什么都做得很好的人,早睡早起,坚持锻炼,沉下心来学习,相信点滴的努力都会有意义,努力追上那个曾将被赋予厚望的自己。

 

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

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

相关文章

基于html+css的图片展示9

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

educoder实训——数值类型

第1关:三角形周长及面积 任务描述 输入的三角形的三条边a、b、c 的长度,计算并依次输出三角形的周长和面积,结果严格保留2位小数。测试用例的数据保证三角形三边数据可以构成三角形。 三角形面积计算公式: 其中s=(a+b+c)/2。 输入格式 分三行输入 3 个浮点数,表示三…

银行数字化转型导师坚鹏:金融数字化转型助力乡村振兴及案例

金融数字化转型助力乡村振兴及案例课程背景&#xff1a; 很多银行存在以下问题&#xff1a; 不清楚如何借助数字化转型助力乡村振兴&#xff1f; 不知道普惠金融模式和产品如何有效创新&#xff1f; 不知道数字化转型助力乡村振兴的成功案例&#xff1f; 课程特色&#xff1…

【用AI写周报,“卷死”同事】打造一款自动生成周报的微信小程序

文章目录前言步骤1&#xff1a;创建一个ChatGPT账号步骤2&#xff1a;创建一个微信小程序并配置API。步骤3&#xff1a;在微信开发者工具中创建一个新的微信小程序项目步骤4&#xff1a;创建ChatGPT API云函数步骤5&#xff1a;创建UI界面步骤6&#xff1a;创建发送邮件的云函数…

Kubernetes 1.27 正式发布

Kubernetes 1.27 正式发布&#xff0c;这是 2023 年的第一个版本。这个版本包括 60 项增强功能。其中 18 项增强功能进入 Alpha、29 项进入 Beta&#xff0c;还有 13 项升级为 Stable 稳定版。 主题和标识 Kubernetes v1.27 的主题是 Chill Vibes 新内容 冻结 k8s.gcr.io镜像…

replugin宿主与插件通信小结

近来replugin开发中遇到宿主和插件间需要通信的情形&#xff0c;思来只有进程间通信(IPC)才是比较好的宿主与插件的通信方式。而Android进程间通信主要有2种方式&#xff1a;Messenger和AIDL。 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android接…

矩阵和线性代数的应用

矩阵和线性代数是数学中重要的概念&#xff0c;它们被广泛应用于物理、工程、计算机科学、经济学等众多领域。本文将讨论矩阵和线性代数的一些基本概念以及它们在实际应用中的重要性和影响。 一、矩阵和线性代数的基本概念 矩阵是由数字组成的矩形数组。它可以表示线性方程组…

线程池并发服务器

线程池技术 线程池技术是一种典型的生产者-消费者模型。 线程池技术是指能够保证所创建的任一线程都处于繁忙状态&#xff0c;而不需要频繁地为了某一任务而创建和销毁线程&#xff0c;因为系统在创建和销毁线程时所耗费的cpu资源很大。如果任务很多&#xff0c;频率很高&am…

Android中级——系统信息与安全机制

系统信息与安全机制系统信息获取/system/build.prop/procandroid.os.buildSystemPropertyPackageManagerActivityManagerpackages.xmlpermissions标签package标签perms标签安全机制Apk反编译apktooldex2jarjd-guiApk加密系统信息获取 /system/build.prop 存放一些配置信息&am…

Seaborn 变量分布分析

文章目录一、数据集1.1 下载数据集1.2 字段含义说明1.3 导入数据集二、初步分析2.1 缺失值分布查看2.2 异常值分布查看2.3 查看变量分布三、数值变量分析3.1 replot()&#xff1a;多个变量之间的关联关系3.2 lmplot()/regplot&#xff1a;分析两个变量的线性关系3.3 displot()&…

从前序与中序遍历序列构造二叉树——力扣105

题目描述 法一&#xff09;递归 复杂度分析 代码如下 class Solution { private:unordered_map<int, int> index;public:TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_ri…

Qt Quick - StackView

StackView 使用总结一、概述二、在应用中使用StackView三、基本的导航1. push Item2. pop Item3. replace Item四、深度链接五、寻找Item六、转换六、Item的所有权七、大小一、概述 StackView可以与一组相互链接的信息页面一起使用。例如&#xff0c;电子邮件应用程序具有单独…

HTML5 <img> 标签

HTML5 <img> 标签 实例 HTML5 <img>标签用于向网页中添加相关图片。 如何插入图像&#xff1a; <img src"smiley-2.gif" alt"Smiley face" width"42" height"42">尝试一下 &#xff08;更多实例见页面底部&…

基于营销类系统运营活动增长带来的数据库设计演进

一、前言 为了支持业务数据的不断增长&#xff0c;在数据库层面的性能提升主要体现在几个维度&#xff1a;1&#xff09;数据降级&#xff1b;2&#xff09;数据主题分而治之&#xff1b;3&#xff09;实时交易转异步&#xff1b;4&#xff09;硬件扩容&#xff0c;当然网上一…

question

4、Mysql高可用有几种方案&#xff0c;分别有什么特点? 特点优点缺点mysql group replication(MGR)组复制组内一半节点同意即可提交更改操作、最多支持 9 个节点、基于MRG插件、多节点写入支持、故障自动检测、引擎必须为 innodb、必须有主键、binlog 为 row强一致、paxos协议…

Arcgis Engine之打开MXD文档

Arcgis Engine之打开MXD文档概述方法一&#xff1a;方法二&#xff1a;概述 图层加载功能将用到MapControl 控件提供的LoadMxFile 方法。 该方法通过指定的*. Mxd文档路径直接获取 该方法第一个参数是文件路径&#xff0c; 第二个参数是MExd文档中地图的名称或索引&#xff0…

1.初识Earth Engine

Earth Engine平台是一个集科学分析和地理信息可视化的综合性平台&#xff0c;该平台提供丰富的API&#xff0c;以及工具帮助方便查看、计算、处理、分析大范围的各种影像等GIS数据。 基础数据 目前Earth Engine上已由几十PB的影像栅格数据及矢量数据数据地址。数据主要分为以…

Prometheus+Grafana从0到1搭建jvm监控

目 录1. 准备工作2. 添加配置2.1 添加maven依赖2.2 application.properties增加配置2.3 新增配置类2.4 配置Prometheus2.5 配置Grafana3. 小结在上一篇博客《 PrometheusMysqld_exporterGrafana从0到1搭建MySQL的可视化监控》&#xff0c;我们完成了对数据库的可视化监控搭建&a…

都说程序员就是吃青春饭,35岁就会被淘汰,我用自己的经历来告诉你事实

上个假期我回家了&#xff0c;遇到三姑六婆总会问我读研没读、工作怎么样、薪资多少等等问题&#xff0c;相信大家也都遇到过。我一般会用“在做程序员&#xff0c;写代码的这种话”来敷衍他们&#xff0c;但没想到他们懂得还挺多的&#xff0c;又搬出了一套关于程序员的理论&a…

当AI遇上元宇宙:智能科技如何助力虚拟世界的发展?

欢迎来到Hubbleverse &#x1f30d; 关注我们 关注宇宙新鲜事 &#x1f4cc; 预计阅读时长&#xff1a;10分钟 本文仅代表作者个人观点&#xff0c;不代表平台意见&#xff0c;不构成投资建议。 人工智能和元宇宙是21世纪最突出的技术之一。它们各自可以在许多方面提高人们…