C++基础算法3:双指针求最长不重复序列

AcWing 799. 最长连续不重复子序列 题目来源:AcWing 799. 最长连续不重复子序列 一、题目描述 给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数n。第一行包含整数 n。第一行包含整数n。 第二行包含n个整数(均在0∼105范围内),表示整数序列。第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。第二 阅读详情

1、双指针概念

双指针是一种常见的算法技巧,它使用两个指针(也称为游标)来遍历数组或数据结构,从而解决问题。在这类问题中,通常一个指针用来遍历数组,而另一个指针用来维护某个条件,使得算法能够有效地解决问题。

常见的双指针类型:

a、左右指针:从数组两边往中间移动。例子:快速排序。

b、快慢指针:两个指针从同一点出发,但是移动快慢不同。例子:求最长不重复序列。

2、实战例子

问题:给定一个序列,求解这个序列中的最长不重复序列的长度。

详细代码:

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int q[N];
int s[N];

int  main()
{
    int n;
    cin >> n;
    for (int i = 0; i < n;  i++) cin >> q[i];
    int res;
    
    for(int i = 0, j = 0; i < n; i ++)
    {
        s[q[i]] ++;
        while (s[q[i]] > 1) -- s[q[j ++]];  // 这里一定要用while,不能if
        res = max(res, i - j + 1);  // 不断比较更新
    }
    
    cout << res;
    return 0; 
}

注意事项:

在求最长不重复序列时,有两种边界条件需要考虑:

第一种:1,2,5,8,9,1

第一种:1,5,8,9,2,2

如果是第一种重复,指针j只需要移动一步即可;

如果是第二种重复,指针j需要移动多步,直至s[2] = 1。

C++题解 最长连续不重复子序列 C++题解 最长连续不重复子序列 题目描述 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。 数据范围 1≤n≤1051≤n≤1051≤n≤105 输入样例: 5 1 2 2 3 5 输出样例: 3 思想 暴力算法 暴力算法显然是最容易考虑的,我们使用两个循环 i , j 对整个数列进行遍历,很 阅读详情

相关推荐

基础算法-双指针算法与位运算-C++实现

基础算法-双指针算法-C++实现 算法基本思想及步骤 题目关键点 AcWing题库-799-最长连续不重复子序列 题目 给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。 输入格式 第一行包含整数n。 第二行包含n个整数(均在0~100000范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。 数据范围 1≤n≤100000 输入样例: 5 1 2 2 3 5 输出样例: 3 代码 #include <iostream&g

nosympathy的博客 539

双指针算法及模板应用

双指针算法 举例:分行输出字符串 基本思路:采用双指针算法 模板应用 最长连续不重复子序列 双指针算法模板: 双指针基本思路: 代码 数组元素的目标和 判断子序列

timerring的博客 6562

STC15单片机实战项目软件开发第四讲 - 按键检测(状态机)

软件开发第四讲 - 按键检测(状态机) 一、工具链接 1、Keil c51 UV4 https://yunpan.360.cn/surl_yrIfYYmeRFk 2、STC-ISP下载软件 https://yunpan.360.cn/surl_yxH4CuUUvI3 二、学习板获取方式 方法1:自己设计PCB,自行打板焊接; 方法2:用群主设计的PCB,自行打板焊接; 方法3:向群主购买,淘宝链接...

硬件家园 3046

双指针算法:输出句中单词 & 最长连续不重复子序列 & 数组元素的目标和

本文介绍了三种基于双指针算法的经典应用: 单词分割:使用双指针高效分割输入字符串中的单词,时间复杂度O(n); 最长不重复子序列:通过维护计数数组和双指针,线性时间找到最长连续不重复子序列; 有序数组目标和:利用数组有序性,通过相向双指针快速找到满足A[i]+B[j]=x的数对。 这些算法都充分利用了双指针的协同移动特性,将暴力解法的时间复杂度从O(n²)优化到O(n),是处理字符串和数组问题的有效技巧。每种方法都配有详细的代码实现、算法分析和示例解释。

Xiaochen_12的博客 1536

Openclaw Onboarding向导全攻略——如何配置你的第一个AI助手

很多新手在成功运行 `openclaw --version` 后,面对黑底白字的终端就陷入了迷茫:“安装好了,然后呢?” 本篇我们就彻底解决这个问题,带你完整走完 `openclaw onboard` 交互式初始化配置向导的每一步,从“安装完成”到“真正能用”,只差这一个向导的距离。 本文为2026年3月最新版,适配OpenClaw v2026.2.x 稳定版,所有步骤均经过实测验证,可直接落地。

夏日清风 1917

带有验证码的爆破(包含Burp suite工具爆破)

关于含有验证码爆破的一些总结!

weixin_43960066的博客 8693

【基础算法】双指针---最长连续不重复子序列

今天我们来继续学习双指针的算法例题,【最长连续不重复子序列】,码字不易,请多多支持。

云小逸的博客 1453

白盒测试逻辑覆盖之谓词覆盖、子句覆盖、三类有效字句覆盖等知识点

本篇笔记会简化书本上的概念,用容易理解的方式来说明,有些例子打字麻烦,我会直接放图片! 目录 基础知识: 谓词覆盖predicate coverage 子句覆盖 clause coverage 组合覆盖 combinatorial coverage 有效字句覆盖Active Clause Coverage 广义有效子句覆盖(General Active Clause Coverage) 相关性有效子句覆盖(Correlated Active Clause Coverage) 限制性有效

weixin_46019681的博客 2664

AcWing - 最长连续不重复子序列(双指针)

题目链接:https://www.acwing.com/problem/content/description/801/ 时/空限制:1s / 64MB 题目描述 给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。 输入格式 第一行包含整数n。 第二行包含n个整数(均在0~100000范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不...

ityanger的技术栈 3348

从 QQ 聊天到 AI Agent:AstrBot + NapCat 接入 DeepSeek

<think>我们根据要求,根据提供的内容生成≤150字的文章摘要。内容是关于在Windows上使用Docker部署AstrBot+NaPCat,配置DeepSeek,实现QQ AI机器人。摘要需简洁概括主要步骤和结论。注意字数。</think>在Windows 11上通过Docker一键部署AstrBot与NapCat,实现QQ机器人。NapCat扫码登录QQ,AstrBot接入并配置DeepSeek API,完成AI对话。后续可扩展人格、插件及MCP工具,并通过cpolar提供公网管理入口,打造可扩展的

天道酬勤 1万+

“详规一张图”——上海土地利用数据

本文围绕城市规划与土地管理中空间数据的重要性,介绍了基于地理信息系统(GIS)技术对上海市用地数据进行获取与处理的具体方法。文章以上海市为例,详细阐述了如何通过构建以10米为间隔的网格点覆盖全市范围,并采用GET请求方式从“上海用地规划官网:详细规划‘一张图’公众版”平台获取地块信息的过程。通过对API接口参数的设置,包括坐标系、几何类型和返回格式等,实现了对每个网格点对应地块的属性信息(如规划用地类型、容积率、地块编号等)及几何形状信息的提取。

weixin_45812624的博客 2197

最长连续不重复子序列

的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。范围内),表示整数序列。

2301_80805258的博客 1857

协方差矩阵自适应进化策略(CMA-ES)详解:从基础原理到优化算法

CMA-ES是一种先进的无导数优化算法,基于生物进化原理解决连续域非线性优化问题。该算法通过自适应调整多元正态分布的均值、协方差矩阵和步长参数,自动学习搜索空间结构,无需梯度信息即可高效优化。核心创新包括协方差矩阵的秩1和秩μ更新策略,以及基于进化路径的步长控制机制。CMA-ES具有旋转不变性、标度不变性和全局探索能力,特别适合3-300维的黑盒优化问题,在复杂系统仿真、超参数调优等领域表现优异。算法实现中关键参数如种群大小、学习率等均有自适应设置规则,使其成为连续优化领域的基准算法之一。

qq_42212808的博客 524

acwing 799. 最长连续不重复子序列(双指针算法)

双指针算法:大致有下面两类类似归并排序 类似快速排序: 核心思想: 示例: 将这个字符串, 以空格分开,并每个字符串占一行 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。思路: 用双指针, 移动右边指针, 然后求左边指针在左边的最左的位置。(左边指针只能往右移动) 左指针: 往左最远能到什么

刘小雨的博客 3322

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

AcWing 799. 最长连续不重复子序列(C++算法)

AcWing 799. 最长连续不重复子序列 1、题目(来源于AcWing): 给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。 输入格式 第一行包含整数n。 第二行包含n个整数(均在0~100000范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。 数据范围 1≤n≤100000 输入样例: 5 1 2 2 3 5 输出样例: 3 2、基本思想: 用双指针 i 和 j 。i 从左向右遍历给定序列中的每一个数并表示满足条件子

YSA__的博客 730

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

双指针算法(最长连续不重复子序列)

i < n;i ++ )// 具体问题的逻辑常见问题分类:(1) 对于一个序列,用两个指针维护一段区间(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作算法思路:先通过暴力算法找到解题思路,接着观察 i 和 j 之间的单调关系,利用单调关系,可以将枚举的数量从 n^2 变成 n ,时间复杂度从O(n^2 )变成O(n)。给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

m0_74381212的博客 538

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

双指针算法(判断子序列,最长连续不重复子序列)

编程题。

刘浩琦的博客 475

双指针算法--最长列许不重复子序列

因为 如果j往前移动 而i往后移动 j 和 i区间被扩大了,而子区间内有重复元素 那么此大区间也必定有重复元素。双指针题目的核心思想就是把双重循环的暴力做法利用某种性质优化到o(n)的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。维护两个指针去遍历此数组的部分区域 i和j都不断往后移动。check()表示查看j i之间是否有重复元素。个整数(均在 0∼105。范围内),表示整数序列。为什么j不往前移动?

weixin_52243202的博客 538

基础算法:双指针算法(最长连续不重复子序列,数组元素的目标和,判断子序列)

双指针算法(例题:最长连续不重复子序列,数组元素的目标和,判断子序列)

sdfzhqy的博客 438

C++ 基础算法 双指针 最长连续不重复子序列

C++ 基础算法 双指针 最长连续不重复子序列

fucheng的博客 626

双指针算法详解

首先有两种双指针算法的形式: 1:对于一个序列,两个指针维护着一段区间。比如快排算法。 2:对于两个序列,维护某种次序。如归并排序中合并两个有序序列的操作。 对双指针算法的理解: 对于需要n^2次暴力搜索算法的优化,使其只需 kn 的复杂度。 for( int i = 0; i < n; i ++) { for( int j = 0; j < n; j ++) { ... }...

qq_45444041的博客 1817

最长连续不重复子序列cpp

最长连续不重复子序列 定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 输入格式 第一行包含整数 n。 第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。 输出格式 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。 数据范围 1≤n≤105 输入样例: 5 1 2 2 3 5 输出样例: 3 核心思路: 遍历数组a中的每一个元素a[i], 对于每一个i,找到j使得双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列,长度为i -

ababy1024的博客 343

基础算法:最长连续不重复子序列—双指针

双指针算法C++模板: for (int i = 0, j = 0; i < n; i ++ ) { while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑 } 常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作 双指针算法理解: 当一个序列的时候,如果我们使用朴素的方法直接遍历 我们固定起点为0,遍历终点,固定起点为1,遍

qq_46470984的博客 281

【C++/Java】详解双指针算法以及与暴力的区别-有序数组和与最长不重复子序列

注意,双指针算法的时间复杂度是O(n),也就是i和j都不会重复扫到一个元素,这里区别于双重循环的O(n^2),在双重循环中,我们的i或者j是有可能一个元素扫描好几次的,一般是n次或者n(n-1)/2或者n(n+1)/2,这里看具体算法了。(许多人认为一层循环嵌套另一层循环,那么时间复杂度就是O(n^2),其实不然,也就是因为这是错误理解,时长分不清双指针和暴力的区别)

AiryCloud的博客 646

双指针算法

刷算法的时候遇到过不少双指针有关的问题,但是从来都没有总结过这一问题。今天下午碰到了正好总结一下,嘿嘿~。首先,双指针与其说是一种算法,倒不如说是一种优化的策略。具体来说,是基于对暴力枚举的一种的优化策略。一个双指针问题通常都有一个需要消耗O(。这样就可以将O(那么废话不多说,一起来看看一些有关双指针的具体问题吧!

lovewyc的博客 861
上一篇: C++基础算法2:差分-解决区间更新问题
下一篇: C++基础算法4:计算机不做减法
桑乔
博客等级 码龄5年 85粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值