算法基础学习|双指针算法

这篇具有很好参考价值的文章主要介绍了算法基础学习|双指针算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

双指针算法

代码模板

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

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

例题一:最长连续不重复子序列

题目

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

输入格式

第一行包含整数 。

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

输出格式

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

数据范围

输入样例

5
1 2 2 3 5

输出样例

3

代码示例

#include <iostream>
using namespace std;

const int N = 100010;

int a[N], s[N];

int main(){
    int n;
    cin >> n;
    for(int i = 0; i < n; i++) cin >> a[i];

    //双指针运算
    int res = 0;
    for(int i = 0, j = 0; i < n; i++){
        s[a[i]]++;
        while(j < i && s[a[i]] > 1) s[a[j++]]--;//先--后++
        res = max(res, i - j + 1);
    }

    cout << res << endl;
}

例题二:数组元素的目标和

题目

给定两个升序排序的有序数组  和 ,以及一个目标值 。

数组下标从 0 开始。

请你求出满足 算法基础学习|双指针算法,Algorithm,算法,学习,C++ 的数对 。

数据保证有唯一解。

输入格式

第一行包含三个整数 ,分别表示  的长度, 的长度以及目标值 。

第二行包含  个整数,表示数组 。

第三行包含  个整数,表示数组 。

输出格式

共一行,包含两个整数  和 。

数据范围

数组长度不超过 。
同一数组内元素各不相同。
 数组元素

输入样例

4 5 6
1 2 4 7
3 4 6 8 9

输出样例

1 1

代码示例

#include <iostream>
using namespace std;

const int N = 100010;

int a[N], b[N];

int main() {
    int n, m, x;
    cin >> n >> m >> x;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    for (int i = 0, j = m - 1; i < n; i++){
        while (j >= 0 && a[i] + b[j] > x) j--;//时间复杂度为O(m+n)
        if (j >= 0 && a[i] + b[j] == x) cout << i << ' ' << j << endl;
    }

}

例题三:判断子序列

题目

给定一个长度为  的整数序列  以及一个长度为  的整数序列 。

请你判断  序列是否为  序列的子序列。

子序列指序列的一部分项按原有次序排列而得的序列,例如序列  是序列  的一个子序列。

输入格式

第一行包含两个整数 。

第二行包含  个整数,表示 。

第三行包含  个整数,表示 。

输出格式

如果  序列是  序列的子序列,输出一行 Yes

否则,输出 No

数据范围

,
文章来源地址https://www.toymoban.com/news/detail-821779.html

输入样例

3 5
1 3 5
1 2 3 4 5

输出样例

Yes

代码示例

#include <iostream>
using namespace std;

const int N = 100010;

int a[N], b[N];

int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < n; i++) cin >> a[i];
    for (int i = 0; i < m; i++) cin >> b[i];

    int i = 0, j = 0; 
    while(i < n && j < m){
        if(a[i] == b[j]) i++;
        j++;
    }
    if(i == n) cout << "Yes" << endl;
    else cout << "No" << endl;
}

到了这里,关于算法基础学习|双指针算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双指针算法,基础算法实践,基本的算法的思想,双指针算法的实现

    双指针算法是一种常用于解决数组和链表问题的算法技巧。它的核心思想是使用两个指针在数据结构中按照一定的规则移动,从而达到快速搜索或处理数据的目的。这个技巧通常用于 优化算法 , 降低时间复杂度 ,提高程序的执行效率。双指针算法有多种应用场景,以下是其

    2024年02月11日
    浏览(38)
  • 【算法】基础算法001之双指针

    👀 樊梓慕: 个人主页  🎥 个人专栏: 《C语言》 《数据结构》 《蓝桥杯试题》 《LeetCode刷题笔记》 《实训项目》 《C++》 《Linux》《算法》 🌝 每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.数组分块(数组划分) 移动零 复写零 2.快慢双指针(循环往复) 快乐数

    2024年02月02日
    浏览(51)
  • 算法学习---双指针算法

    在处理数组和链表相关问题时,双指针技巧是经常用到的,双指针技巧主要分为两类: 左右指针和快慢指针 对于单链表来说,大部分技巧都属于快慢指针,在数组中并没有真正意义上的指针,但我们可以把索引当做数组中的指针。 https://leetcode.cn/problems/remove-duplicates-from-so

    2024年03月11日
    浏览(34)
  • 蓝桥杯-双指针 | 最长连续不重复子序列 | 算法基础

    ⭐ 简单说两句 ⭐ ✨ 正在努力的小新~ 💖 超级爱分享,分享各种有趣干货! 👩‍💻 提供:模拟面试 | 简历诊断 | 独家简历模板 🌈 感谢关注,关注了你就是我的超级粉丝啦! 🔒 以下内容仅对你可见~ 作者: 后端小知识 , CSDN后端领域新星创作者 |阿里云专家博主 CSDN 个

    2024年02月03日
    浏览(45)
  • C++学习算法心得和部分算法讲解(三指针)

    本文代码皆是可运行代码,选用了逻辑和实现最简单的方式呈现,部分代码带有注解,可供初学者学习!【点赞+收藏】 目录 一、三指针: 二、汉诺塔: 三、N皇后问题: 四、熄灯问题: 五、二进制密码锁 六、快排(模板) 七、归并排序(模板) 八、逆序对的数量: 九、

    2024年02月12日
    浏览(42)
  • C语言-基础语法学习-3 二级指针

    当涉及到多级指针时,C语言的灵活性和强大的指针功能可以得到充分的发挥。二级指针是指指向指针的指针,也被称为指向指针的引用。 使用二级指针可以实现以下功能: 动态内存分配:通过二级指针可以动态地分配内存块,并将其地址传递给其他函数或模块进行操作。这

    2024年02月12日
    浏览(44)
  • 贪心算法(Greedy Algorithm)

    贪心算法(Greedy Algorithm)是一种解决优化问题的算法策略。在贪心算法中,每一步都会选择当前情况下最优的选择,而不考虑未来的后果。 贪心算法的基本思想是通过局部最优选择达到全局最优。它并不保证一定能得到全局最优解,但在某些情况下可以得到近似最优解或者

    2024年02月09日
    浏览(39)
  • 算法介绍 | 泛洪算法(Flood fill Algorithm)

    漫水填充算法、种子填充算法(Seed Fill) 用于确定连接到多维数组中给定节点的区域,可以用来标记或者分离图像的一部分,实现如Ps中自动选区功能。 顾名思义就像洪水漫过一样,把一块连通的区域填满。 当然水要能漫过需要满足一定的条件,可以理解为满足条件的地方

    2024年02月14日
    浏览(39)
  • Algorithm_01--C#递归算法

    ///递归算法本质: ///1、方法的自我调用 ///2、有明确的终止条件 ///3、每次调用时,问题规模在不断减少。通过递减,最终到达终止条件     问题:程序在输入1000后(即1到1000的和),程序会出现异常。 解答:百度后得出结论,栈溢出异常。 1、递归方法在每次调用自身时,

    2024年02月06日
    浏览(35)
  • 遗传算法 (Genetic Algorithm, GA)

    遗传算法(Genetic Algorithm,简称GA)起源于对生物系统所进行的计算机模拟研究,是一种随机全局搜索优化方法,它模拟了自然选择和遗传中发生的复制、交叉(crossover)和变异(mutation)等现象,从任一初始种群(Population)出发,通过随机选择、交叉和变异操作,产生一群更适合

    2024年02月05日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包