算法刷题笔记 最长连续不重复子序列(C++实现)

65 篇文章 3 订阅
59 篇文章 1 订阅

题目描述

  • 给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。

输入格式

  • 第一行包含整数n
  • 第二行包含n个整数(均在 0∼10^5范围内),表示整数序列。

输出格式

  • 共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。

数据范围

  • 1 ≤ n ≤ 10^5

解题思路

这道题实际上就是一道双指针算法题,其解题思路基本上和我之前的一篇博文 力扣刷题笔记3 无重复字符的最长子串 完全类似。那一道题目借鉴了哈希集合,用于以字符为键,查找当前右指针指向的元素是否在集合中。本题实际更简单一些,只需要用整数位键来查找即可。因此,不难联想到我们可以直接使用最简单的数组进行查找,因为数组可以被简单视为键为整数的哈希集合。所以得到的代码如下。

实现代码

#include <cstdio>

const int N(1e5 + 10);
int arr[N];
bool record[N];

int main(void)
{
    int n;
    scanf("%d", &n);
    int max_length(0);
    for(int i(0); i < n; ++i)
    {
        scanf("%d", &arr[i]);
    }
    for(int left(0), right(0); left < n; ++left)
    {
        while(record[arr[right]] == false && right < n)
        {
            record[arr[right++]] = true;
            max_length = (right - left > max_length) ? right - left : max_length;
        }
        record[arr[left]] = false;
    }
    printf("%d", max_length);
    return 0;
}
  • 注意事项:在编程的过程中,一定不能为了追求代码的简洁而将多个步骤合并,否则检查和调试过程非常麻烦。
  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值