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

【算法】双指针

作者:指针不指南吗
专栏:算法篇

🐾或许会很慢,但是不可以停下来🐾

文章目录

  • 1.双指针分类
  • 2.双指针思想
  • 3.双指针应用

1.双指针分类

常见问题分类

(1) 对于一个序列,用两个指针维护一段区间, 比如快速排序。

(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作。(这种情况比较多)


2.双指针思想

//朴素算法 
for(int i=0;i<n;i++)for(int j=0;j<n;j++)······//每道题的具体逻辑

将上面朴素算法的 O( n2n^2n2 ) 优化为 O( n );

for (int i = 0, j = 0; i < n; i ++ )
{while (j < i && check(i, j)) j ++ ;// 具体问题的逻辑
}

所以可以想出朴素算法,然后用双指针算法做出优化


3.双指针应用

例题1.

单独输出单词

输入一个字符串,把里面的每个单词输出出来,每个单词之间用空格隔开。

思路

一个指针 i 指向单词的开头,另一个指针 j 指向单词的结尾。

  • 先枚举 i ,然后让 j 指向 i 即单词开头,j++, 直到遇到空格,表示这个单词结束。

  • 输出一个单词结束之后,记得让 i = j ,更新 i , 跳过当前单词,进入下一个的单词开头。

代码实现

#include<bits/stdc++.h>
using namespace std;int main()
{char s[100010];  //输入一个字符串gets(s);int n=strlen(s);for(int i=0;i<n;i++){   // 枚举i,i表示一个单词的开头int j=i;  while(j<n&&s[j]!=' ') j++;  //j表示单词的结尾,即不超过字符串的长度,遇到空格表示一个单词结束//这道题的具体逻辑 for(int k=i;k<=j;k++)  cout<<s[k];  //输出单词cout<<endl;i=j;  //令 i 跳过已经输出的单词}return 0;
}

例题2.

最长连续不重复子序列

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

输入格式

第一行包含整数 n。

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

输出格式

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

数据范围

1≤n≤105

输入样例:

5
1 2 2 3 5

输出样例:

3
  • 思路

    枚举 i 表示区间右端点的指针 , j 表示区间左端点的指针,

    利用区间内数字出现的个数,来判断是否满足条件;

    i 向前走一步,a [ i ] 所表示的数出现的次数多一次,用 s 数组把数字出现的次数存起来;

    j 从 0 开始走,如果在 i 走的过程中 s [ a [ i ] ] > 1,则说明 i 现在表示的数与之前的重复了,

    让 j 往前走,区间挤出去一个数,先 s [ a [ j ] ] --,再 j ++, 直到把重复的数挤出去,即 s [ a [ i ] ] <= 1;

    i 每走一步,判断一下区间大小,是否做出最大值 res 更新;

  • 代码实现

    #include<bits/stdc++.h>
    using namespace std;const int N=100010;
    int n;
    int a[N],s[N];  //a表示原整数序列,s 表示区间内数字出现的次数int main()
    {cin>>n;for(int i=0;i<n;i++) cin>>a[i];  //读入数据int res=0,i=0,j=0;  //res 表示最大的区间大小for(i=0;i<n;i++){s[a[i]]++;  //i前进,区间内a[i]的出现次数增加while(s[a[i]]>1){  //若出现重复元素则进入循环s[a[j]]--; //j前进,a[j]出现次数减少一次j++;}res=max(res,i-j+1);	//更新最大值}cout<<res;return 0;
    }
    
http://www.lryc.cn/news/12759.html

相关文章:

  • Flutter-Widget-学习笔记
  • easyExcel 写复杂表头
  • 关于线程池的执行流程和拒绝策略
  • 【李忍考研传】二、约定
  • 2023-2-19 刷题情况
  • LeetCode笔记:Weekly Contest 333
  • 元数据管理 1
  • 统计二进制中比特1的个数
  • 第三方实现跑马灯和手写实现跑马灯
  • React Native Cannot run program “node“问题
  • python基于vue微信小程序 房屋租赁出租系统
  • ThreadPoolExecutor管理异步线程笔记
  • MotoSimEG-VRC教程:动态输送带创建以及示教编程与仿真运行
  • PyTorch 并行训练 DistributedDataParallel完整代码示例
  • Golang实现ttl机制保存内存数据
  • js中数字运算结果与预期不一致的问题和解决方案
  • C++ Primer Plus 学习笔记(一)——基本类型
  • ChatGpt与Google 谁能给出最好的回答
  • 【Redis】一、CentOS64 安装 Redis
  • Redis底层原理(持久化+分布式锁)
  • Spring Cloud Nacos实战(八) - Nacos集群配置
  • 什么是低代码-甲骨文对低代码的定义
  • shell编程之循环语句
  • 神经动力学-第一章-神经动力学基础-神经系统的元素
  • 【力扣-LeetCode】64. 最小路径和 C++题解
  • Mysql数据库事务
  • 【opencv源码解析0.3】调试opencv源码的两种方式
  • Xcode Archives打包上传 / 导出ipa 发布至TestFlight
  • RNN GRU模型 LSTM模型图解笔记
  • 西电_数字信号处理二_学习笔记