双指针 (C/C++)

news2025/1/16 8:22:22

1. 双指针

双指针算法的核心思想:将暴力解法的时间复杂度,通常是O(N*N),通过某种特殊的性质优化到O(N)。

做题思路:先想想暴力解法的思路,然后分析这道题的特殊性质,一般是单调性。然后得出双指针算法的思路。

双指针算法的模板:

for(int i = 0; i <n; i++)

{

        while(j < i && check(i, j))

                j++;

        //具体题目的解题思路

}、

1.1 例题

给定一个长度为 n 的整数序列,请找出最长的不包含重复数数字的最长子序列,输出它的长度。

输入格式

第一行包含整数 n 。

第二行包含 n 个整数(均在0 ~ 100000范围内),表示整数序列。

输出格式

共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。

数据范围

1 <= n <= 100000

按照上面介绍的解题思路:我们先看看暴力解法怎么做的:两层for循环,外层循环在遍历数组时,对于外层循环遍历的每一个值,内层循环都会从该位置开始去遍历,通过检查区间内是否存在重复数字,更新结果。显然这种解法的事件复杂度为O(N*N)。伪代码如下:

for (int i = 0; i < n; i++)
{
    for (j = i + 1; j < n; j++)
    {
        if (!check(i, j))
            ret = max(ret, i - j + 1);
    }
}

其中n为数组的长度,check为检查区间 [ i, j ] 中的元素是否存在重复的数字,如果不存在更新结果,保存到ret中。

双指针:同样根据上面提供的解题思路,我们尝试从暴力解法中分析出单调性。嗯,双指针的左侧指针在整个查找过程中是单调的。怎么理解呢?

下面以一个具体的例子:1,2,2,3,5 来分析哈:

 现在我们已经知道了双指针的大致思路了,但是好像还没有弄清除单调性从何而来。对于本题单调性就是:在 i++ 向右找更大的满足要求的更长区间时,j不可能存在向前动 (j--) 的情况。即,本题中 j 具有单调性。

 弄清除了这些,我们只需要知到怎么判定一个区间中是否有重复元素就行了。我们可以初始化一个数组a,遍历原数组b, 得到的值假设为s,就让 a[s] + 1,代表这个数字出现了一次。注意当一个区间中没有重复元素时,i++,那么只有原数组中下标为 i 的 的值才会是重复的元素,因此我们只需要判断 a[b[i]] 的值是否是大于 1 即可。这就是模板中的 check 。另外本题中不要 i > j 这个条件,因为 i == j 时,区间 [j, i] 中就没有重复的元素了,i然后就会加一,即 j 是不会大于 i 的。

当区间内存在重复元素时,j++的同时要将 a[b[j]]--,少了一个数字嘛。

 现在可以写代码啦!

int main()
{
	const int N = 100000;

	//原数组
	int b[N];
	//统计数字出现次数的数组
	int a[N] = { 0 };

	//用于保存最大的区间长度
	int ret = 0;
	int j = 0;

	//读入数据
	int n;
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
	{
		scanf("%d", &b[i]);
	}

	//核心算法
	for (int i = 0; i < n; i++)
	{
		a[b[i]]++;
		while (a[b[i]] > 1)
		{
			//少一个数字,次数减一
			a[b[j]]--;
			j++;
		}
		//更新结果
		ret = ret > i - j + 1 ? ret : i - j + 1;
	}
	//打印结果
	printf("%d\n", ret);

	system("pause");
	return 0;
}

1.2 小试牛刀(来源:Acwing)

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

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

相关文章

微信协议网页版微信协议解析

最近在做个微信机器人&#xff0c;所以研究了网页版的微信协议及相关接口&#xff0c;在这里简单总结一下。从表面上看&#xff0c;对于网页版微信我们的使用流程是这样的&#xff1a;很简单&#xff0c;只有四步&#xff0c;但如果细化到内里细节的话&#xff0c;上面这简单四…

一文带你快速入门zabbix6.0的日常操作

文章目录前言一. zabbix基本操作入门1.1 登录和配置用户1.1.1 登录zabbix1.1.2 防爆力破解机制1.1.3 创建用户1.1.4 创建报警媒介1.1.5 设置 权限选项卡1.1.6 设置用户的访问主机权限1.2 新建主机1.2.1 添加主机1.2.2 关于添加的信息注释1.3 新增监控项1.3.1 添加监控项1.3.2 配…

若依系统如何集成qq邮件发送【超详细,建议收藏】

若依系统的部署博主就不在这儿阐述了&#xff0c;默认大家的电脑已经部署好了若依系统&#xff0c;这里直接开始集成邮件系统&#xff0c;首先我们得需要对qq邮箱进行配置&#xff1b;一套学不会你来打我&#x1f600;&#xff1b; 一、开启我们的qq邮箱发送邮件的配置 1、先进…

Qt音视频开发16-通用悬浮按钮工具栏的设计

一、前言 通用悬浮按钮工具栏这个功能经过了好几个版本的迭代&#xff0c;一开始设计的时候是写在视频控件widget窗体中&#xff0c;当时功能简单就放一排按钮在顶部悬浮widget中就好&#xff0c;随着用户需求的变化&#xff0c;用户需要自定义悬浮条的要求越发强烈&#xff0…

K_A12_031 基于STM32等单片机驱动TEMT6000环境光传感器 串口与OLED0.96双显示

K_A12_031 基于STM32等单片机驱动TEMT6000环境光传感器 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明IIC地址/采集通道选择/时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RCTEMT6000环境光传感器模块1.2、STM32F103C8T6TEMT6000环境光…

ZCMU--5009: 龙虎斗

轩轩和开开正在玩一款叫《龙虎斗》的游戏&#xff0c;游戏的棋盘是一条线段&#xff0c;线段上有n个兵营(自左至右编号1~n)&#xff0c;相邻编号的兵营之间相隔1厘米&#xff0c;即棋盘为长度为n-1厘米的线段。i号兵营里有ci位工兵。 下面图1为n 6的示例: 轩轩在左侧&#xf…

如何通过IP找到地址?

在我们印象中&#xff0c;我们都知道可以通过 IP 地址找到某个人。但当我们细想一下&#xff0c;我们会发现其实 IP 地址与地理位置并不是直接相关的。那我们到底是如何通过 IP 地址找到地址的呢&#xff1f;答案是&#xff1a;通过自治系统&#xff08;Autonomous System&…

大势前瞻!文旅还是短视频,你弯道超车风口在这了

三年前&#xff0c;新冠疫情的影响波及整个各行各业行业&#xff0c;互联网寒冬&#xff0c;房地产崩盘&#xff0c;教培团灭&#xff0c;在这样的背景下&#xff0c;行业都进入了发展“冰雪期”。老话说大疫后必有大变&#xff0c;如今风雪融化&#xff0c;万物复苏&#xff0…

day01_HTML常识

基础概念铺垫 认识网页 网页的组成&#xff1a;文字、图片、音频、视频、超链接一系列元素网页的本质&#xff1a;程序员写的代码通过浏览器转化&#xff08;解析和渲染&#xff09;成用户看到的网页网页是由网页元素组成的 &#xff0c; 这些元素是利用html标签描述出来&…

面试攻略,Java 基础面试 100 问(十八)

JAVA IO 包 JAVA NIO NIO 主要有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buffer(缓冲区), Selector。 传统 IO 基于字节流和字 符流进行操作&#xff0c;而 NIO 基于 Channel 和 Buffer(缓冲区)进行操作&#xff0c;数据总是从通道读取到缓冲区 中&#xff0c;或者…

不可替代的测试人:一文解释探索性测试是什么

剧本式测试 随着软件技术的发展&#xff0c;软件开发过程中对软件测试的需求越来越庞大&#xff0c;从原来单纯的寻找软件缺陷&#xff0c;到后来的学习软件、挖掘软件中存在的缺陷、评估软件可用性、性能等等方面&#xff0c;软件测试发挥着重要作用。 考虑到软件测试如此的…

视频流截取保存到本地路径(打包jar包CMD运行)

需求&#xff1a;现在有一批https的监控视频流URL&#xff0c;需要对视频流进行每三秒截屏一次&#xff0c;并保存到本地路径&#xff0c;png格式&#xff0c;以当前时间命名。代码&#xff1a;import org.bytedeco.javacv.FFmpegFrameGrabber; import org.bytedeco.javacv.Fra…

微信小程序登录

小程序登录 | 微信开放文档 (qq.com)https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html 静默登录 首先需要在微信开发者工具中获取code(wx.login(Object object) | 微信开放文档 (qq.com)) 前端处理获取code其次&#xff1a;需要appid,se…

PyQt5数据库开发2 5.1 QSqlQueryModel

目录 一、Qt窗体设计 1. 新建Qt项目 2. 拷贝4-3的部分组件过来 3. 添加资源文件 4. 创建Action 5. 添加工具栏 6. 创建菜单项 7. 关闭Action的实现 8. 调整布局 8.1 调整两个groupbox的布局 8.3 为窗体设置全局布局 二、代码拷贝和删除 1. 新建项目目录 2. 编译…

游戏化销售管理是什么?使用CRM系统进行有什么用?

对于企业销售来说&#xff0c;高薪酬也伴随着更高的压力与挑战。高强度的单一工作会让销售人员逐渐失去对工作的兴趣&#xff0c;导致销售状态缺少动力和激情&#xff0c;工作开展愈加困难。您可以通过CRM系统进行游戏化销售管理&#xff0c;让销售人员重新干劲满满。 游戏并不…

Matlplotlib绘图

0 建议学时 4学时 1 Matlplotlib库介绍 Matplotlib库由各种可视化类构成&#xff0c;内部结构复杂 受Matlab启发&#xff0c;matplotlib.pylot是绘制各类可视化图形的命令字库&#xff0c;相当于快捷方式 Matplotlib中文网&#xff1a;https://www.matplotlib.org.cn 安装&…

【离线数仓-4-数据仓库设计】

离线数仓-4-数据仓库设计离线数仓-4-数据仓库设计1.数据仓库分层规划2.数据仓库构建流程1.数据调研1.业务调研2.需求分析3.总结2.明确数据域3.构建业务总线矩阵&维度模型设计4.明确统计指标1.指标体系相关概念1.原子指标2.派生指标3.衍生指标2.指标体系对于数仓建模的意义5…

Python-可变类型、不可变类型和遍历列表

1.可变类型和不可变类型python的类型根据值是否可变分为两类可变类型:列表、字典、集合等 值可以改变不可变类型&#xff1a;数字、字符串、元组等 值不可以改变注意&#xff1a;可变类型对象和不可变类型对象都不能更改类型本身2.遍历列表2.1正序遍历提前通过len函数获取元素总…

蓝桥杯:聪明的猴子

题目链接&#xff1a;聪明的猴子https://www.lanqiao.cn/problems/862/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 运行限制 解题思路&#xff1a; 最小生成树 AC代码&#xff08;Java&#xff09;: 课后练习&#xff1a; 题目描述 在一个热带雨林中生存…