滑动窗口的实例学习 (Unique snowflakes, Uva 11572)

例题8-7 UVA11572 Unique Snowflakes(25行AC代码) 紫书刷题进行中,题解系列【GitHub|优快云】 例题8-7 UVA11572 Unique Snowflakes(25行AC代码) 题目大意 给定一个序列,求一个连续,无重复元素的最长序列。 思路分析 如果直接枚举任意长度的连续序列,复杂度为O(n2),再加上set判重O(logn),总时间复杂度为O(n2logn),显然需要优化。这里可以用双指针/滑动窗口优化 设置指向当前区间的左右指针pl... 阅读详情

参考的紫皮书上的例子,Unique snowflakes, Uva 11572。两个函数分别用set和map,代码与紫皮书上稍有差别。

set里面就是放的滑动窗口。map< key, value >里面key是 a[i], value是a[i]的上一个相同位置的下标。用set有点好处就是最后函数返回的时候, set里面就是滑动窗口的各个元素。用map则只能返回l,r的值。

这题也是学习set和map的好例子。具体代码如下:

#include <iostream>
#include <set>
#include <map>

using namespace std;

int a[1000005];

//using set
int unique_snowflakes(int a[], int len) {
    set<int> s;
    int l=0, r=0;
    int maxLen=0;
    while(r!=len) {
        if (!s.count(a[r])) {
            s.insert(a[r]);
            maxLen = max(maxLen, r-l+1);
            r++;
        }
        else{
           s.erase(a[l++]);
        }
    }

   return maxLen;
}

//using map
int unique_snowflakes_2(int a[], int len) {
    int maxLen = 0;
    map<int, int> m;

    int lastExist[len];
    for (int i=0; i<len; i++) {
        if (!m.count(a[i])) {
            lastExist[i] = -1;
        }
        else{
            lastExist[i] = m[a[i]];
        }

        m[a[i]] = i;
    }

    int l=0, r=0;
    while (r!=len) {
        if (lastExist[r]<l) { //lastExist(r)<l<=r
            maxLen = max(maxLen, r-l+1);
            r++;
        }
        else{  //l<=lastExist(r)<=r
           l++;
        }
    }

    return maxLen;

}

 int main( ) {
    int T, n;
    scanf("%d", &T);
    while (T--) {
        scanf("%d", &n);
        for (int i=0; i<n; i++) scanf("%d", &a[i]);
        int maxLen = unique_snowflakes_2(a, n);
        printf("%d\n", maxLen);

    }

    return 0;
}

想了一下,其实第二种方法还有一点优化空间。在while的else分支里面,l可以直接跳到lastExist[r]+1,而不是逐一递增。因为我们已经知道else分支对应l<=lastExist[r]<=r, 在l到lastExist(r)之间我们不需要再试了(因为有重复a[r]),直接将l跳到lastExist[r]+1即可。不过这种优化后的复杂度仍然是o(nlogn)。

//using map
int unique_snowflakes_2(int a[], int len) {
    int maxLen = 0;
    map<int, int> m;

    int lastExist[len];
    for (int i=0; i<len; i++) {
        if (!m.count(a[i])) {
            lastExist[i] = -1;
        }
        else{
            lastExist[i] = m[a[i]];
        }

        m[a[i]] = i;
    }

    int l=0, r=0;
    while (r!=len) {
        if (lastExist[r]<l) { //lastExist(r)<l<=r
            maxLen = max(maxLen, r-l+1);
            r++;
        }
        else{  //l<=lastExist(r)<=r
            // l++;
            l=lastExist[r]+1;
        }
    }

    return maxLen;

}

要注意的一点是:
1) set.count(x)和map.count(x)都只返回0或1。0表示集合中没有x,1表示有。注意这里即使x在set或map中出现多次,这两个count()也只返回1。切记!
在这道题中我们不需要记录x的出现次数。那么如果需要的话办呢?自己写个数组cnt[],每一项对应每个元素出现的次数,然后insert()和erase()的时候加加减减就可以了。

WEB页面中嵌套的滚动窗口实例页面 “WEB页面中嵌套的滚动窗口”中的演示文件。 立即下载

相关推荐

从加权最小二乘(WLS)到IAA:手把手推导DOA估计中的迭代自适应核心公式

本文深入解析了从加权最小二乘(WLS)到迭代自适应算法(IAA)在DOA估计中的数学推导与应用。通过动态调整加权矩阵,IAA在低快拍数、相干源等复杂场景中展现出卓越性能,显著提升角度分辨率和检测概率。文章详细介绍了算法核心步骤、工程优化策略及前沿发展,为雷达探测和无线通信领域提供重要参考。

weixin_30847865的博客 291

力扣(三)

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pw

Touale的博客 723

机械臂电机力矩计算

设计 6 轴机械臂时,电机力矩计算是确保机械臂负载能力、运动精度和安全性的核心环节,需围绕和两大核心展开,结合机械臂结构参数(如关节长度、质量分布)、负载需求(如末端负载重量、惯性)和运动参数(如加速度、角速度)逐步推导。

ZPC8210的博客 1857

算法之滑动窗口案例

1、无重复字符串的最长子串 描述: 给定一个字符串 s(s 由英文字母、数字、符号和空格组成) ,请你找出其中不含有重复字符的最长子串的长度。 示例: 示例 1: 输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3: 输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",

icemwj的博客 347

华为海思IC前端中后端(COT&XPU)岗位笔试机考题

华为海思COT和XPU部门IC前端,IC中端,IC后端岗位笔试真题分享

weixin_37584728的博客 3362

unity人物刚体移动_Unity3D实现2D人物移动-总结篇

背景最近研究Unity3d,2d寻路的实现。所以又一次涉及到了角色坐标位移的问题。系统的对于角色鼠标点击移动这个简单问题进行整理和总结。本来就是一个简单的几何问题,结果发现已经有两个小坑,顺便填上,这里做下总结。实现需求:通过鼠标点击,控制2d角色移动,就是点哪里,角色向移动到哪里问题分解:按照时间进行动画分解,鼠标输入(动画开始)、平移(动画进行)、移动结束(动画结束)前提:这里前面的文章基本解...

weixin_39610366的博客 1277

【算法优选】 滑动窗口专题——壹

基本概念滑动窗口是一种基于双指针的一种思想,两个指针指向的元素之间形成一个窗口。分类:窗口有两类,一种是固定大小类的窗口,一类是大小动态变化的窗口。一起加油。

m0_71731682的博客 2315

USB 基础学习:USB 电气信号介绍

USB电气信号技术解析 USB通信的核心是差分信号传输技术,通过D+和D-两根线传输相位相反的电压信号实现数据通信。USB信号系统包含三类关键信号:差分数据信号(抗干扰性强)、单端状态信号(用于设备识别)和电源信号(提供5V供电)。USB2.0采用400mV电压摆幅和NRZI编码,支持低速(1.5Mbps)至高速(480Mbps)传输;USB3.0则新增专用差分对,数据速率可达20Gbps。物理层通过上拉/下拉电阻检测设备连接,高速模式需特殊握手协议。抗干扰设计的关键在于保持差分线等长、阻抗匹配和使用共模扼

浩瀚之水的专栏 1784

什么是TCP滑动窗口?(解释+流程示例)

滑动窗口(Sliding Window)是一种用于实现流量控制和可靠数据传输的机制,在网络通信中被广泛使用,尤其是在传输控制协议(TCP)中。 滑动窗口是发送方和接收方之间的一种协议约定,用于控制发送方发送数据的速率和接收方接收数据的能力。接收方按照自己接收缓冲区大小和处理能力决定接收窗口大小,用接收窗口大小控制发送窗口大小,再由发送窗口大小控制发送速率。

qq_46631497的博客 2万+

安装西门子TIA Portal V15.1提示先决条件不足如何处理?

安装TIA Portal STEP 7 Professional WinCC Professional V15.1提示先决条件不足,需要如何才能够满足安装条件呢? 1.硬件要求: 安装 STEP 7 Basic / Professional V15.1 的计算机必须至少满足以下需求: 处理器: Core i5-6440EQ 3.4 GHz 或者相当 内存: 16GB或者更多(对于大型项目,为32GB) 硬盘:SSD,配备至少50GB的存储空间 图形分辨率:最小 1920 x 1080 显示器:15.6"

Robot_PLC_HMI_Automation 2万+

基于STM32+OneNet设计的物联网智慧路灯(100)

本次设计的智能路灯采用STM32芯片和OneNet物联网平台进行连接,开发出支持太阳能充电锂电池供电、GPS定位上传位置信息、手动/自动控制路灯开关、环境光照调节、红外传感器检测周围人员、空气质量监测等多项功能。同时,当路灯发生异常情况时,系统可以自动发送邮件或短信到指定邮箱或电话。

7728

滑动窗口一文全面解析

处理数组或字符串的连续子序列问题时,滑动窗口是一种高效且实用的算法策略,它通过在序列上滑动一个固定或可变大小的 “窗口”,动态地维护窗口内的元素信息,从而快速解决诸如最大子数组和、最长无重复子字符串等经典问题。本文我将深入探讨滑动窗口的概念、原理、实现方式、应用场景以及优化技巧,结合丰富的代码示例,帮助读者全面掌握这一重要算法。

2120

10.2 全栈 CRUD 工程结构搭建:Cursor 4 步初始化 + 3 层目录规范

揭示 Cursor 工程初始化中 4 个关键动作如何将 AI 上下文感知能力从 30% 提升至 85%,包括用 pnpm create 显式声明结构契约、通过 monorepo.config.json 设定 workspace 根以支持跨包类型引用、在 shared 包中固化共享类型与协议,以及后续

weixin_42545292的博客 69

uva 11572 Unique Snowflakes

题目大意:求给定序列的最大连续的各个数字不同的序列长度。 解题:此题不是难题,就是使用一个hash表来查找在前面是否存在一个数与当前的相等,如果相等就将左边的边界设为相等的数的pos+1,再将当前的数加入hash表中,唯一注意的点就是在hash查找的时候注意判断左边的下界就行了。 // // main.cpp // uva 11572 - Unique Snowflakes

最爱她! 321

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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...

[UVa 11572] 唯一的雪花(Unique Snowflakes)

Judge:https://vjudge.net/problem/UVA-11572 题意:在一个长度最多为10^6的序列中找到一个尽量长的、没有相同元素的连续子序列。

StarlitNight的博客 682

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Unique Snowflakes UVA - 11572 唯一的雪花 滑动窗口

题目:https://vjudge.net/problem/UVA-11572 【分析】 假设序列元素从0开始编号,所求连续子序列的左端点为L,右端点为R。首先考虑起点L=0的情况。可以从R=0开始不断增加R,相当于把所求序列的右端点往右延伸。当无法延伸(即A[R+1]在子序列A[L~R]中出现过)时,只需增大L,并且继续延伸R。既然当前的A[L~R]是可行解,L增大之后必然还是可行解,所以不必...

Nicolas的博客 490

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

uva 11572 Unique Snowflakes

#include<iostream> #include<algorithm> #include<queue> #include<cmath> #include<math.h> #include<string> #include<string.h> #include<map> #include<unordered_map> #include<unordered_set> #includ...

qq_35752161的博客 192

算法竞赛入门:UVA11572 Unique Snowflakes

可以使用双指针法解决问题,移动指针保证两个指针形成的子区间没有重复的元素,C++ 可以用到 STL set ,Java 语言可以使用 HashSet 存储元素(当然用哈希表代替也可以)。指针 i 指向区间左端点,指针 j 指向区间右端点,j 不断尝试向右侧扩展区间,将新数加入到 Set 中,如果发现元素有重复,则移动 i 指针缩短区间长度。这种算法的编程的套路比较固定,对于这类题型,只需要分析清楚题目的应用场景,选择适合的做法即可。实际上,本题还有其他解法,例如二分法,map 等。

WenW1217的博客 310

UVA 11572 Unique Snowflakes .

题目地址:http://vjudge.net/problem/UVA-11572 第一种用set做 #include using namespace std; #define REP(i,a,b) for(int i=a;i<=(int)(b);++i) #define REPD(i,a,b) for(int i=a;i>=(int)(b);--i) int A[(int)1e6+5];

BRCOCOLI的博客 336

洛谷 UVA11572 唯一的雪花 Unique Snowflakes

Emily 的公司的口号是“把独特打包起来”,为了实现这一诺言,一个包裹里不能有两片一样的雪花。Emily 想知道这样一个不包含两片一样的雪花的包裹最大能有多大,她可以在任何时候启动机器,但是一旦机器启动了,直到包裹被封上为止,所有通过机器的雪花都必须被打包进这个包裹里,当然,包裹可以在任何时候被封上。第一行是测试数据组数 T,对于每一组数据,第一行是通过机器的雪花总数 n(n≤106),下面 n 行每行一个在 [0,109] 内的整数,标记了这片雪花,当两片雪花标记相同时,这两片雪花是一样的。

2401_87918203的博客 557

【高效算法设计——滑动窗口】UVa 11572 Unique Snowflakes

题意:给定n个数,求最长的一段使得该段内没有重复数字 思路:对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,先增加R直到出现重复数字,再增加L,再增加R,直到R达到n 那么我们需要一些数据结构来存储一些数据,使得我们能在短时间内判断窗口内是否出现重复数字 这里提供两种方法,第一个是经典的set,将窗口内的数字动态存储在

Lost in your eyes 852

第三十八题 UVA11572 唯一的雪花 Unique Snowflakes

PDF Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devised a machine that captures snowflakes as they fall, and serializes them into a stream of snowflakes ...

苦鬼·。 474

UVa 11572 Unique Snowflakes

Emily the entrepreneur has a cool business idea: packaging and selling snowflakes. She has devised a machine that captures snowflakes as they fall, and serializes them into a stream of snowflakes tha

c21c21的专栏 452

[容易] UVa OJ 11572 Unique Snowflakes 滑动窗口

题目描述 基本思路: 本题实际上就是找各元素互不相同的最长连续子序列,因为是连续的,所以可以采用滑动窗口来做,若L为窗口的左端点,R为窗口的右端点,则先扩展R,如果不能继续扩展,则扩展L,继续扩展R,直到R指向全序列的最后一个元素。 具体代码: #include #include #include using namespace std; vector sf; int solve(

zypang1的博客 318

例题 8-7 唯一的雪花(Unique snowflakes, UVa 11572)

原题链接:https://vjudge.net/problem/UVA-11572 分类:滑动窗口 备注:双指针 #include<bits/stdc++.h> using namespace std; const int maxn=1e6+5; map<int,int>vis; int t,n,a[maxn]; int main(void){ // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdou

TK_wang_的博客 433

uva 11572 unique snowflakes——yhx

Emily the entrepreneur has a cool business idea: packaging and selling snowakes. She has devised amachine that captures snowakes as they fall, and serializes them into a stream of snowakes that o...

a394121312的博客 168
上一篇: 煎饼排序 (Stacks of Flapjacks, Uva 120)
下一篇: C++中的4种cast学习(dynamic_cast, static_cast, reinterpret_cast, const_cast)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值