AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

AcWing 799. 画个简图辅助理解    原题链接    简单

作者: 作者的头像   liangshang ,  2020-05-21 23:04:07 ,  所有人可见 ,  阅读 14997


206


121

C++ 代码

#include <iostream>
using namespace std;

const int N = 100010;
int a[N], count[N];
int n, ans;

int main() {
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    for (int i = 0, j = 0; j < n; j++) {
        count[a[j]] ++;
        while (count[a[j]] > 1) {
            count[a[i]] --;
            i++;
        }
        ans = max(ans, j - i + 1);
    }
    printf("%d", ans);
    return 0;
}

1.png

  • 时间复杂度:使用双指针的题目一般都是$O(n)$
  • 空间复杂度:标记数组占内存比较大,数组长度为数据范围上界,其实完全可以用哈希表代替,这样优化后额外的空间复杂度就是$O(n)$

54 评论


用户头像
Shier833_Ww   2023-02-02 12:01      17    踩      回复

感谢图解!很清晰!分享个人看了楼主图解后,对while循环的理解:

        while (count[a[j]] > 1) {
            //分析点①(while循环逻辑):发现j指向的数前面出现重复的之后,j停止;i开始向j靠近,靠近过程中得把i前面的标记位从1置0;
            //直到i找到了和j重复的那个数后,count[a[i]] --也就使得count[a[j]]置0,<1就退出while循环了
            count[a[i]] --;//分析点②:要先--,再i++,否则就落掉当前i指向的那个数对应的标志位置0,还会导致while循环提前退出
            i++;
        }

用户头像
Pobz   2023-01-06 11:22      2    踩      回复

用户头像
xyd   2023-03-27 16:24      1    踩      回复

图来

用户头像
RNM   9个月前    回复了 xyd 的评论         踩      回复

脑婆脑婆


用户头像
嘤雄达拉崩吧   2022-08-18 09:49      2    踩      回复

你们的那个图都是哪里画的啊?

用户头像
奔马   2022-09-07 14:32         踩      回复

同问

用户头像
国乙私人bot   2023-01-19 16:05         踩      回复

同问

用户头像
宝藏男孩青蛙王子   2023-04-06 14:51         踩      回复

平板

用户头像
椎名真由理   2023-05-22 09:12         踩      回复

感觉像vision


用户头像
xuekai   2022-03-06 10:52      2    踩      回复

个人理解:
为方便表述,记 最长连续不重复子序列 为C,
[i, j]表示当前C,长度是j - 1 + 1。
j指针用于遍历数组a,当发生重复,一定是a[j]与前面的a[k]相等,其中i <= k <= j - 1。
若发生重复,用i指针来清除[i, k]范围内的数组a的值在数组count中的标记,确保数组count只记录[i, j]即当前C中出现的数字。
由于无从得知这个C的起始下标和结束下标,因此每轮循环对ans的值与当前C的长度j - 1 + 1取max。


用户头像
想想y总会怎么做-_-   2023-07-30 15:12      1    踩      回复

图解好清晰,看一下就会写了昂


用户头像
acwing_8669   1个月前         踩      回复

佬,想问下为什么在输入时cin >> a[i];count[a[i]] ++记录次数会wa,在遍历时记录次数ac


用户头像
云遮月酒亦寒   6个月前         踩      回复

orz


用户头像
wzh1123   7个月前         踩      回复

nb老哥


用户头像
_三七_   7个月前         踩      回复

很棒


用户头像
丁真-珍珠   11个月前         踩      回复

你是我的神!


用户头像
摆神   2023-09-20 08:45         踩      回复

第二个分号行:count[a[i]]——结束后,此时它为1,种终止while循环


用户头像
yxc的迷弟   2023-03-30 18:23         踩      回复

鼠太感谢您的图解了


用户头像
最菜的卷心菜   2023-03-08 16:44         踩      回复

感谢,真的很好理解


用户头像
不劳不获.   2023-02-22 20:38         踩      回复

代码题解能看懂,自己写到是什么也不会了


用户头像
天蓝Bluky   2023-02-22 20:25         踩      回复

截图留名,感谢大佬


用户头像
不会java114514   2023-02-16 21:33         踩      回复

借图


用户头像
小huohuo   2022-12-05 18:41         踩      回复

借图


用户头像
maxwell_1024   2022-11-16 15:38         踩      回复

大佬,图怎么画的,教教我


用户头像
凤凰涅槃   2022-11-09 22:43         踩      回复

真的很nice,我自己看了两个小时,看了你这个图,10分钟就懂了,你真的是我的神!!!


用户头像
苦苣Java   2022-10-30 22:19         踩      回复

用数组模拟set集合
妙啊


你确定删除吗?
1024
x

© 2018-2024 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息