首页 > 编程语言 >双指针算法

双指针算法

时间:2023-03-19 22:46:59浏览次数:39  
标签:10 int ++ 算法 include 指针

一、常见类型

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

 

(2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作(如:归并排序)

 

二、模板

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

三、核心思想及时间复杂度

核心思想:优化

暴力算法: O(n²)

1 for (int i = 0; i < n; i++)
2     for(int j = 0; j < n; j++)

 

双指针算法:O(n)

四、例题

1、输入一个字符串,每个单词用一个空格隔开,输出其中的单词,每个单词占一行。

如: 输入  abc def gh

   输出  abc

        def

        gh

 

 1  1 #include <iostream>
 2  2 #include <string.h>
 3  3 using namespace std;
 4  4 
 5  5 int main()
 6  6 {
 7  7     char str[1000];
 8  8     gets(str);
 9  9     int n = strlen(str);
10 10     for(int i = 0; i < n; i++)
11 11     {
12 12         int j = i;
13 13         for(j<n && str[j] != ' ') j++;
14 14         
15 15         //这道题的具体逻辑
16 16         while(int k = i; k < j; k++) cout << str[k];
17 17         cout << endl;
18 18         i = j;
19 19     }
20 20     return 0;
21 21 }

 

2、最长连续不重复子序列

 

 

 暴力算法:O(n²)

1 for(int i = 0; i < n; i++)
2     for(int j = 0; j <= i; j++)
3         if(check(j,i))
4         {
5             res = max(res,i-j+1);
6         }

双指针算法:O(n)

1 for(int i = 0, j = 0; i < n; i++)
2 {
3     while(j <= i && check(j,i)) j++;
4     res = max(res,i-j+1);
5 }

优化:j无需从0开始遍历,只需从i开始即可

 1 #include <iostream>
 2 using namespace std;
 3 const int N = 1e5 + 10;
 4 
 5 int a[N], s[N];
 6 int n;
 7 
 8 int main()
 9 {
10     cin >> n;
11     for(int i = 0; i < n; i++) scanf("%d", &a[i]);
12     int ans = 0;
13     for(int i = 0, j = 0; i < n; i++)
14     {
15         s[a[i]]++;
16         while(j<i && s[a[i]]>1)
17         {
18             s[a[j]]--;
19             j++;
20         }
21         ans = max(ans,i-j+1);
22     }
23     cout << ans;
24     return 0;
25 }

五、思路

先写出暴力解法O(n²),然后观察i和j的关系(是否具有单调性),如果有,则利用单调性,利用双指针优化到O(n)

注意:时间复杂度看的不是循环嵌套次数,而是看重复遍历了几次。

 

 

 

 

 

 

标签:10,int,++,算法,include,指针
From: https://www.cnblogs.com/FISHCat-cjp/p/17234640.html

相关文章

  • 算法思维:思考问题的一种方式
    方法论:万物皆朴素的第一性原理几乎任何领域的任何问题的解决方案,都可以看作是“某个结构上的朴素方法的优化“。计算机只能处理规模有限的问题,在给定规模且不考虑效率的......
  • 初始指针
    指针是什么?在计算机科学中,指针(pointer)编程语言的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量......
  • 数学知识模板之欧几里得算法
    欧几里得算法求最大公约数intgcd(inta,intb){ returnb?gcd(b,a%b):a;}扩展欧几里得算法//x,y是使x*a+y*b=d的一组解intexgcd(inta,intb,int......
  • 时间复杂度--大O记算法
       EG:  ......
  • 目标检测中算法评价指标FPS和mAp
    FPS就是目标网络每秒可以处理(检测)多少帧(多少张图片),FPS简单来理解就是图像的刷新频率,也就是每秒多少帧,假设目标检测网络处理1帧要0.02s,此时FPS就是1/0.02=50。mAP预测......
  • ChatGPT背后的算法——RLHF总结
    ChatGPT背后的算法——RLHF总结参考链接:抱抱脸:ChatGPT背后的算法——RLHF|附12篇RLHF必刷论文(qq.com)背景 (文本生成的语言模型评价不在训练中)chatGPT训练4步骤......
  • KMP算法思考
    第一个全匹配没有价值,从第二个开始    采取每次匹配的最大值,则next数组为 计算next数组时也用了KMP算法,因此当不匹配时,j=next[j]; ......
  • 数学建模算法-神经网络
    ​ 神经网络算法是一类基于生物神经网络结构和功能的计算模型。它是一种机器学习算法,可以用于识别、分类、模式匹配、预测等任务。神经网络由许多个简单的处理单元(神经元......
  • acwing算法基础课整理
    acwing算法基础课整理模板基础算法排序快速排序#include<iostream>usingnamespacestd;constintN=1e6+10;intq[N];intn;voidquick_sort(intq[],in......
  • DRF算法
    中文译名:优势资源公平性:多种资源类型的公平分配摘要解决不同类型资源在系统内的资源公平分配问题,提出优势资源公平性算法(DRF),是一种对多种资源类型的最大-最小公平性的推广。......