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

刷leetcodehot100返航版--双指针5/16

for (int i = 0, j = 0; i < n; i ++ )
{
    while (j < i && check(i, j)) j ++ ;

    // 具体问题的逻辑
}
常见问题分类:
    (1) 对于一个序列,用两个指针维护一段区间
    (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作

核心思想:把for i{for j}O(n^2)优化为O(n)

朴素做法——>O(n)

1.最长连续不重复子序列【看解析】

799. 最长连续不重复子序列 - AcWing题库

e.g.12245

最长连续不重复子序列:245

一般思路:确定起止点,双层for遍历,比如i是终止点,j是子序列起始点;for 0~n-1 看有没有重,计max的子序列长度

优化:在这个过程中,其实随着i增大,j是不会往左走的,因为重复的子序列不会向左增加

也就是j其实在i遍历过程是单调递增的【当然也可以不增,起码不减】,就省了j的遍历

有一点点像:

128. 最长连续序列 - 力扣(LeetCode)

主体思路是遍历子序列最后一个元素,判断j是不是要往右移

其中,判断重复与否用到的是unordered_map

#include<iostream>
#include<algorithm>//algorithm
#include<unordered_map>
using namespace std;int main(){//请找出最长的不包含重复的数的连续区间int n;cin>>n;vector<int>nums(n);for(int i = 0;i<n;i++){cin>>nums[i];}unordered_map<int,int> s;//初始化int maxNum = 0;int j = 0;//j是子序列的开头int i;for(i = 0;i<n;i++){//i是结尾s[nums[i]]++;while(i>j){// if(s[i] != s[j]){//判断不重复不合理if(s[nums[i]]>1){//每次其实新加的是第i个元素s[nums[j]]--;//删除的是j对应元素j ++;}else{//没写break;}//没保存max}maxNum = max(i-j+1,maxNum);}cout<<maxNum<<endl;
}

相关文章:

  • 西安前端面试
  • 机器学习中的特征工程:解锁模型性能的关键
  • 计算机组成原理——数据的表示
  • 代码随想录 算法训练 Day3:链表1
  • 隧道结构安全在线监测系统解决方案
  • 从裸机开发到实时操作系统:FreeRTOS详解与实战指南
  • 英飞凌TLE9945GPT12
  • SSH主机密钥验证失败:全面解决方案与技术手册
  • 【言语】刷题5(填空)
  • MySQL数据库——支持远程IP访问的设置方法总结
  • 【RabbitMQ】消息丢失问题排查与解决
  • 将单链表反转【数据结构练习题】
  • (for 循环) VS (LINQ) 性能比拼 ——c#
  • 半导体供应链B2B集成时应该注意的要点
  • vue3中预览Excel文件
  • Spring三级缓存的作用与原理详解
  • 【每天一个知识点】意图传播(Intent Propagation)
  • 单例模式深度解析:从原理到高阶应用实践
  • 文章记单词 | 第89篇(六级)
  • jvm第一篇《内存与垃圾回收》学习笔记第一章jvm初始
  • 《五行令》《攻守占》,2个月后国博见
  • 跨越三十年友情,61岁余隆和60岁齐默尔曼在上海再度合作
  • 多地举办演唱会等吸引游客刺激消费,经济日报:引导粉丝经济理性健康发展
  • 证券日报:降准今日正式落地,年内或还有降准空间
  • 北京今日白天超30℃晚间下冰雹,市民称“没见过这么大颗的”
  • 检疫期缩减至30天!香港优化内地进口猫狗检疫安排