当前位置: 首页 > news >正文

双指针算法 cpp


6. 双指针

优化暴力枚举

又称尺取法/滑动窗口

当我们发现在两层 for 循环的暴力枚举过程中,两个指针是可以不回退的,此时我们就可以利用两个指针不回退的性质来优化时间复杂度

因为双指针算法中,两个指针是朝着同⼀个⽅向移动的,因此也叫做同向双指针

学习过程中, 要学会如何从暴力解法优化成双指针算法

6.1 唯一的雪花

[!洛谷]

UVA11572 唯一的雪花 Unique Snowflakes

UVA11572 唯一的雪花 Unique Snowflakes - 洛谷

题目描述

企业家 Emily 有一个很酷的主意:把雪花包起来卖。她发明了一台机器,这台机器可以捕捉飘落的雪花,并把它们一片一片打包进一个包裹里。一旦这个包裹满了,它就会被封上送去发售。

Emily 的公司的口号是“把独特打包起来”,为了实现这一诺言,一个包裹里不能有两片一样的雪花。不幸的是,这并不容易做到,因为实际上通过机器的雪花中有很多是相同的。Emily 想知道这样一个不包含两片一样的雪花的包裹最大能有多大,她可以在任何时候启动机器,但是一旦机器启动了,直到包裹被封上为止,所有通过机器的雪花都必须被打包进这个包裹里,当然,包裹可以在任何时候被封上。

输入格式

第一行是测试数据组数T TT,对于每一组数据,第一行是通过机器的雪花总数n nnn ≤ 10 6 n \le {10}^6n106),下面n nn行每行一个在[ 0 , 10 9 ] [0, {10}^9][0,109]内的整数,标记了这片雪花,当两片雪花标记相同时,这两片雪花是一样的。

输出格式

对于每一组数据,输出最大包裹的大小。

输入输出样例 #1

输入 #1

1 5 1 2 3 2 1

输出 #1

3
思路:
  1. 故事背景挖思路:在序列中, 选一段最长连续序列, 这段序列中的所有元素都不同, 输出长度
  2. 算法原理
    1. 解法一 : -> 会超时
      暴力枚举 -> 枚举出所有符合要求的子数组, 找出最长的
      1. 枚举所有的子数组 :
        两层for循环
      2. 判断枚举的子数组中所有的元素都不同
        借助哈希表
    2. 解法二 : 利用调性, 使用 “同向双指针” 来优化
      1. 性质 : 在暴力枚举的过程中left和right是可以不回退的
      2. 用法(模板 / 分析方式)
        1. 初始化 :
          定义 left = 1 , right = 1;
          维护窗口的信息 的结构 : unorderet_map<int , int>mp;
        2. 进窗口 :
          让 right 所指的元素进窗口
          mp[a[right]] ++;
        3. 判断 :
          判断窗口是否合法
          mp[a[right]] > 1
        4. 出窗口 :(窗口不合法)
          让left所指的元素出窗口;
          mp[a[left]]--
        5. 3-4 循环
        6. 更新结果 :(窗口合法)
          ret = max(ret , right - left +1);

节省时间的原因:

规避了很多不必要的枚举过程

时间最多为 O(n+n) = O(2n);

代码:
#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intn;inta[N];intmain(){intT;cin>>T;while(T--){cin>>n;for(inti=1;i<=n;i++)cin>>a[i];//初始化intleft=1,right=1,ret=0;unordered_map<int,int>mp;//维护窗口内所有元素出现的次数while(right<=n){//进窗口mp[a[right]]++;while(mp[a[right]]>1){//出窗口mp[a[left]]--;left++;}//窗口合法 , 更新结果ret=max(ret,right-left+1);right++;}cout<<ret<<endl;}return0;}

数组实现:

#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+10;intn;inta[N];intmain(){intT;cin>>T;while(T){cin>>n;for(inti=1;i<=n;i++)cin>>a[i];intleft=1,right=1,ret=0;intb[N]={0};while(right<=n){b[a[right]]++;while(b[a[right]]>1){b[a[left]]--;left++;}ret=max(ret,right-left+1);right++;}cout<<ret<<endl;}return0;}

看到新题, 要尝试用各种解法来解决
可以先用暴力枚举的方式写, 然后优化


http://www.cnnetsun.cn/news/1363204.html

相关文章:

  • Pi0 Robot Control Center真实效果:从图像输入到关节动作输出端到端延时
  • 从边界到洞察:全国自然保护区矢量数据的GIS实战应用
  • Qwen2.5-VL-7B-Instruct视觉助手:解决图片识别、OCR提取等实际问题的利器
  • Qwen3-TTS性能优化实战:开启FlashAttention,推理速度提升30%
  • PNP算法在机器人视觉里程计中的应用:从原理到落地
  • 3D打印机热床PID自动调谐指南:Klipper固件下如何避免温度波动
  • ROS2 Galactic环境下WheelTec机器人小车编译全流程:从glog安装到wheeltec_rrt_msg编译
  • 1.48米高3D打印AI设计部件现身TCT,Leap71创始人将到访华曙高科
  • 解决ONNX转NCNN常见报错:Shape/Tile not supported的5种实战方案
  • 基于Magma的智能文档处理系统:OCR与NLP完美结合
  • Allegro PCB避坑指南:热风焊盘制作+过孔添加全流程(附17.4版本实测)
  • Z-Image Atelier 图像生成实战:Python爬虫数据驱动创意设计
  • 终极指南:OpenCore Legacy Patcher 让老旧Intel Mac焕发新生
  • 实战指南 | TSMaster图形模块高级配置解析(四)—— 以CAN信号波形优化为例
  • 告别复杂配置!GLM-4V-9B一键部署指南,单卡4090就能跑
  • 阿里小云KWS模型与Node.js的后端集成指南
  • 避免日期验证的坑:正则表达式在YYYY/MM/DD、YYYY-MM-DD、YY.MM.DD格式中的常见错误与修正
  • SenseVoice Small地震预警应用:台站语音→震级速报+影响范围结构化输出
  • 如何启动WaveTools:鸣潮工具箱的快速访问指南
  • USB摄像头一拖四避坑指南:从供电配置到端口切换的5个常见问题解答
  • 【庖丁解牛】机器人动力学-拉格朗日方程实战拆解
  • 基于LSTM的UI-TARS-desktop时序预测:提升自动化决策准确率
  • 基于MogFace-large的实时视频流分析系统架构设计
  • Step3-VL-10B-Base模型LaTeX文档智能插图与排版辅助
  • 2026 届校招启幕:AI 人才成大厂必争之地,行业竞争白热化信号凸显
  • SmolVLA实战案例:基于Gradio的多用户并发测试与会话隔离方案
  • 航空航天局域网需求:Vue3如何扩展百度WebUploader支持卫星遥感数据的分片校验上传?
  • Step3-VL-10B在重装系统后的快速部署方案:一键恢复AI环境
  • Prompt Cache深度解析教程(非常详细),Agent架构纪律从入门到精通,收藏这一篇就够了!
  • lingbot-depth-pretrain-vitl-14深度补全效果展示:raw_depth.png补全前后PSNR/SSIM指标分析