双指针算法的一个简单题解

news/2024/10/12 1:18:13

题目是这样的:
给定一个长度为 n
的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数 n

第二行包含 n
个整数(均在 0∼105
范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤105
输入样例:
5
1 2 2 3 5
输出样例:
3
这题用双指针算法,先介绍一下双指针算法,双指针算法最大的一个好处便是把时间复杂度从o(n**2)降低到o(n),这道题如果我们使用朴素的暴力枚举是可以做的,最好的枚举结果是
int res = 0

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

for(int j = 1;j <= i;j ++)
{
if check(i,j)//这里的函数是判断i到j之间有无重复元素

  continue;elseres = max(res,i - j + 1);

}

这段代码的时间复杂度是O(n^2)。

解析:

外层循环从1到n,共执行n次。
内层循环在最坏情况下(即每次i都满足check(i, j)条件)会执行i次,因此总的执行次数为1 + 2 + ... + n = n * (n + 1) / 2,这是一个关于n的二次函数。
因此,时间复杂度为O(n^2)。
为什么双指针算法的时间复杂度是o(n)呢?
第一层循环枚举n次,但第二层的执行次数最多是n次,属于o(1)的复杂度,所以总的时间复杂度便是o(n)的复杂度。

附上本题的c++代码:

include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 10;

int n;
int a[N],s[N];//a是原数组,s是统计从j到i之间每个元素出现的次数

int main()
{
int res = 0;//答案
cin >> n;
for(int i = 0;i < n;i ++) cin >> a[i];

for(int i = 0,j = 0;i < n;i ++)
{s[a[i]] ++;while(s[a[i]] > 1){s[a[j]] --;//移动j指针,直到没有重复的元素j ++;}//这部分代码当这次枚举的i与上一次的重复时会执行res = max(res , i - j + 1);
}cout << res << endl;return 0;

}
若有不足之处还望指出,感谢您的浏览!

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

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

相关文章

Design Compiler多时钟约束

这里的资料来源于《Synopsys Timing Constraints and Optimization User Guide, Version P-2019.03-SP4, September 2019》 下面图中这几种情况都是我在实际项目中碰到过的,因此有必要单独做个说明。 第一个是同步派生时钟,即CK2是通过CK1的分频来产生的,我们之前的一个实际…

uniapp创建小程序

uniapp创建小程序https://www.dcloud.io/一、安装Hbuilder和对应基本操作 ​ 安装Hbuilder这里就不在赘述。 (一)、插件安装: ​ 如果考虑到后续需要使用Scss,可以前往插件市场进行搜索安装,浏览器会提示我们是否需要打开对应的HbuilderX,然后进入应用进行安装。(二)…

labelme使用方法

labelme是一款在实例分割、语义分割、目标检测等任务中的一个常用工具,本文将介绍如何使用labelme。 labelme有各种版本,包括ubuntu、windows、macOS等。关于windows版本,也可以下载其相关的exe文件https://github.com/wkentaro/labelme/releases来使用标注 一、安装labelme…

《综合与Design Compiler》笔记

《综合与Design Compiler》笔记 一直没系统的整理过DC这块的东西,这里借助一个挺好的文档《综合与Deisgn Compiler》以及我自己的经验和理解来归总一下。 1. 综合是什么 综合是使用软件的方法来设计硬件,然后将门级电路实现与优化的工作留给综合工具的一种设计方法。它是根据…

C# unsafe 快速复制数组

/// <summary>/// 复制内存/// </summary>/// <param name="dest">目标指针位置</param>/// <param name="src">源指针位置</param>/// <param name="count">字节长度</param>/// <returns&…

11.Java集合框架_Set接口

Set接口和常用方法 基本介绍无序(添加和取出的顺序不一致),没有索引。 不允许重复元素,所以最多包含一个null。 JDK API中Set接口的实现类有HashSet、LinkedHashSet和TreeSet。set接口常用方法 和List接口一样,set接口也是Collection的子接口,因此,常用方法和Collection…

罗技鼠标永久宏定义设置

背景 写程序用到最多的组合按键就是ctrl+c, ctrl+v, 而这些能不能在鼠标上实现,这样就能解放左手了(机智如我) 硬件 需要一款支持宏定义的鼠标,而罗技系列正好拥有(未收广告费),目前尝试在g102, g304, gpwer代上都可运行 思路 使用ghub软件定义宏后加载到鼠标的板载内存上遇…