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

PCIe Crosslink

PCIe Crosslink(交叉连接)是一种特殊的PCIe链路连接方式,允许两个PCIe设备(通常是Root Complex或Endpoint)是指两个PCIe设备(如两个CPU、两个FPGA或两个GPU)通过PCIe链路直接连接,形成点对点(P2P)通信通道。:两个Intel/AMD CPU通过PCIe Crosslink直接通信(替代UPI/Infinity Fabric)。:主板需提供PCIe Crosslink连接(如特定插槽支持x16/x8 Crosslink)。

zly8865372的博客 1636

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

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

Xiaochen_12的博客 1536

[记录一个bug]av_hwdevice_ctx_create出现Cannot allocate memory(附带库运行时路径)[已解决]

新写的程序里调用ffmpeg的av_hwdevice_ctx_create()这个函数,出现Cannot allocate memory。但是另个程序一样的代码,居然是成功的。 反复检查之后无果,就跳出去查了一下,看到一个问答: Have you tried to use ffmpg executables with the same libs that you using when you run the app? Have you tried to use ffmpg executables

熊猫Ben的博客 3586

企业级AI Agent平台建设方案

本报告将深入剖析构成一个顶级AI Agent平台的各个功能层面,为构建者提供一份全面的战略蓝图。

分享AI和大数据领域的知识和研究 1582

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

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

云小逸的博客 1453

六维力传感器选型指南:电阻式vs电容式,哪个更适合你的工业场景?

本文深入解析六维力传感器在工业自动化中的选型要点,重点对比电阻式与电容式传感器的核心原理、环境适应性及成本结构。针对不同工业场景(如高精度装配、重载机器人等),提供专业选型建议,帮助工程师优化系统性能与经济效益。

weixin_42525005的博客 395

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

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

ityanger的技术栈 3348

Motoman机器人离线编程——Motocom32开发简介

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章: Motoman机器人离线编程——Motocom32开发简介 Motoman机器人离线编程——Visio Studio环境配置 Motoman机器人离线编程——Motocom32库函数的使用与封装 Motoman机器人离线编程——Motocom32参考文献及注意事项 Motoman机器人离线编程——MotocomES介绍 ...

冯Jungle的个人博客 8713

彻底解决Win11锁屏界面黑屏或者图片不变化

windows锁屏后黑屏

renkai721的专栏 1万+

最长连续不重复子序列

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

2301_80805258的博客 1857

QNX系统中的密码哈希格式——数据安全深度分析

综上所述,QNX系统中的Shadowed密码哈希格式提供了一种有效的数据安全机制,能够保护用户密码的安全性。通过将用户密码的哈希值存储在系统文件中,并结合哈希算法和盐值的使用,可以有效地防止明文密码泄露和密码破解。密码哈希是一种常用的安全技术,用于将用户密码转换为不可逆的哈希值,以保护用户的敏感信息。在QNX操作系统中,存在一种称为Shadowed密码哈希格式的机制,用于存储用户密码的安全散列值。当用户登录系统时,系统会将用户输入的密码与保存的哈希值进行比对,以验证密码的正确性。在上述代码中,首先使用。

UneDatabase的博客 252

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

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

刘小雨的博客 3322

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

m0_74381212的博客 538

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

编程题。

刘浩琦的博客 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、付费专栏及课程。

余额充值