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

【算法基础】1.6 双指针算法

文章目录

  • 双指针思想
  • 最长连续不重复子序列
  • 数组元素的目标和
    • 题目
    • 讲解
  • 判断子序列

双指针思想

双指针算法,就是可以将 n ^ 2 优化到 n。
在这里插入图片描述

最长连续不重复子序列

给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5 + 5;
int a[N], cnt[N];

int main()
{
    int n, ans = 0;
    scanf("%d", &n);
    for (int i = 0, j = 0; i < n; ++i) {
        scanf("%d", &a[i]);
        ++cnt[a[i]];
        while (cnt[a[i]] > 1) --cnt[a[j++]];
        ans = max(ans, i - j + 1);
    }
    printf("%d\n", ans);
    return 0;
}

相似题目:
https://leetcode.cn/problems/longest-substring-without-repeating-characters/
https://leetcode.cn/problems/zui-chang-bu-han-zhong-fu-zi-fu-de-zi-zi-fu-chuan-lcof/

数组元素的目标和

题目

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

数组下标从 0 开始。

请你求出满足 A[i]+B[j]=x 的数对 (i,j)。

数据保证有唯一解。

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n, m, x;
    scanf("%d%d%d", &n, &m, &x);
    int a[n], b[m];
    for (int i = 0; i < n; ++i) scanf("%d", &a[i]);
    for (int i = 0; i < m; ++i) scanf("%d", &b[i]);
    for (int i = 0, j = m - 1; i < n && j >= 0;) {
        if (a[i] + b[j] == x) {
            printf("%d %d\n", i, j);
            break;
        } else if (a[i] + b[j] < x) ++i;
        else --j;
    }
    return 0;
}

讲解

这道题的关键是想到一个数组从前往后,另一个数组从后往前
这里是两个数组,如果是一个数组的话也是一样的。

这样处理可以保证一个指针一直往前,另一个指针一直往后,它们的移动方向是不变的。

判断子序列

给定一个长度为 n 的整数序列 a1,a2,…,an 以及一个长度为 m 的整数序列 b1,b2,…,bm。

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

子序列指序列的一部分项按原有次序排列而得的序列,例如序列 {a1,a3,a5} 是序列 {a1,a2,a3,a4,a5} 的一个子序列。

在这里插入图片描述

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    int a[n], b[m];
    for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]);
    for (int i = 0; i < m; i ++ ) scanf("%d", &b[i]);
    int i = 0, j = 0;
    for (; i < m && j < n; ++i) {
        if (a[j] == b[i]) ++j;
    }
    if (j == n) puts("Yes");
    else puts("No");
    return 0;
}

这个思路就很简单了,两个指针分别去遍历两个数组,相同时才移动需要匹配的数组,这样到最后如果走过了完整一遍,说明就匹配到了。

相关文章:

  • 长春建站网站/企业员工培训内容及计划
  • 网站建设策划文案/百度本地惠生活推广
  • 网站怎么做双语种/关键词优化seo优化
  • 建设一个电影网站怎么做/万江专业网站快速排名
  • 网站模板免费下载网页模板/百度学术论文查重入口
  • 始兴建设局网站/优化视频
  • 虹科分享 | HPC调度解决方案:HK-Adaptive在数字卫星图像领域的应用
  • Pycharm入门搭建Django 项目
  • 【5】KubeSphere部署应用 | MySQL
  • 十三.动态内存管理
  • HTML实现除夕最美烟花,2023春节倒计时,新年不可没有烟花,最炫烟花代码分享
  • 关于常引用的问题 #什么是权限放大?权限放小?隐式或强制转换居然还有这一步?...#
  • Vite性能优化之分包策略
  • Secret
  • 爬虫进阶(web逆向初步)
  • 列表元素的最大值,最小值,出现的次数和列表长度
  • 基于机器学习 实现APT 检测(附完整代码)
  • 数据结构——括号匹配问题