c++算法学习笔记 (9) 双指针

news2024/10/7 10:21:05

1.最长连续不重复子序列

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

输入格式

第一行包含整数 n。

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

输出格式

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

数据范围

1≤n≤10^5

输入样例:
5
1 2 2 3 5
输出样例:
3

(i作为终点枚举,j作为起点,在i固定时往右遍历到i)

#include <iostream>
#include <string.h>
using namespace std;
const int N = 100010;
int n;
int a[N];
int s[N]; // i到j每个数出现的次数

int main()
{
    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]]++;//每次i往后走一个
        while (j <= i && s[a[i]] > 1)
        {
            s[a[j]]--;
            j++;
        }
        res = max(res, i - j + 1);
    }
    cout << res;
}

这里直接用数组s[N]存每个数的次数(因为数据比较小)。

若数据比较大,可以用map<int,int>存储数值及其次数。

请参考下面的例题:

https://blog.csdn.net/l141930402/article/details/136807066?spm=1001.2014.3001.5501

2. 数组元素的目标和

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

数组下标从 00 开始。

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

数据保证有唯一解。

输入格式

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

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

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

输出格式

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

数据范围

数组长度不超过 10^5。
同一数组内元素各不相同。
1≤数组元素≤10^9

输入样例:
4 5 6
1 2 4 7
3 4 6 8 9
输出样例:
1 1

代码1:暴力(超时了) 

#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
int n, m, x;
int a[N], b[N];
int main()
{
    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; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (a[i] + b[j] == x)
            {
                cout << i << " " << j;
                return 0;
            }
        }
    }
}

代码2:

思路:此题的AB数组都是升序,满足单调性,所以用双指针

#include <iostream>
using namespace std;
const int N = 100005;
int n, m, x;
int a[N], b[N];
int main()
{
    scanf("%d %d %d", &n, &m, &x);
    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; i++)
    { // i从开始,j从m-1开始,因为AB都为升序,所以Ai增大后Bi必然要减小(从两边向中间逼近答案)
        while (j >= 0 && a[i] + b[j] > x)
            // 找a[i] + b[j] > x&&j靠左的位置
            j--;
        if (a[i] + b[j] == x)
        {
            cout << i << " " << j;
            break;
        }
    }
    return 0;
}

3. 判断子序列

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

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

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

输入格式

第一行包含两个整数 n,m。

第二行包含 n 个整数,表示 a1,a2,…,an。

第三行包含 m 个整数,表示 b1,b2,…,bm。

输出格式

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

否则,输出 No

数据范围

1≤n≤m≤10^5,
−10^9≤ai,bi≤10^9

输入样例:
3 5
1 3 5
1 2 3 4 5
输出样例:
Yes
#include <iostream>
using namespace std;
const int N = 100005;
int n, m;
int a[N], b[N];
int main()
{
    int n;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> a[i];
    for (int i = 0; i < m; i++)
        cin >> b[i];
    int j = 0;
    int num = 0;
    for (int i = 0; i < n; i++)
    {
        while (j < m && a[i] != b[j])
        {
            j++;
        }
        if (a[i] == b[j] && i < n && j < m)
        // 这里加上边界条件,否则j>=m后b[j]=0也会与a[i]作比较,若a[i]此时为0,就会有错误
        {
            num++;
            j++;
        }
    }
    if (num == n)
    {
        cout << "Yes";
    }
    else
    {
        cout << "No";
    }
    return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1525659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

初识Java篇(JavaSE基础语法)(1)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言&#xff1a; 初识Java 运行Java程序 注释 标识符 关键字 数据类型与变量 字面常量 数据类型 变量 类型转换 类型提升 字…

基于springboot在线博客系统源码和论文

社会的发展和科学技术的进步&#xff0c;互联网技术越来越受欢迎。网络计算机的生活方式逐渐受到广大人民群众的喜爱&#xff0c;也逐渐进入了每个用户的使用。互联网具有便利性&#xff0c;速度快&#xff0c;效率高&#xff0c;成本低等优点。 因此&#xff0c;构建符合自己要…

Git Bash命令初始化本地仓库,提交到远程仓库

git init&#xff1a;初始化空仓库 // 初始化一个空仓库或者重新初始化一个存在的仓库 git init git remote // 为当前本地仓库添加一个远程仓库地址 git remote add origin https://gitee.com/xxx/demo.git git pull // 从设置好链接的远程仓库拉去已经存在的数据&#xff0c;…

疯狂送树莓派Pico!与CODESYS和上海晶珩一起,探索慕尼黑上海电子展!

3月20日-3月22日 上海新国际博览中心 E2馆 2200展 上海晶珩 X CODESYS 与您相约慕尼黑上海电子展 上海晶珩&#xff08;EDATEC&#xff09;荣幸宣布&#xff0c;将与全球自动化软件领导者CODESYS公司共同参展2024慕尼黑上海电子生产设备展&#xff01; 届时&#xff0c;我…

【数据结构】二叉树的相关操作以及OJ题目

文章目录 1. 二叉树2.二叉树的遍历2.1前序遍历2.2中序遍历2.3后序遍历2.4层序遍历 3.树的节点个数4.树的高度5.叶子节点的个数6.第k层节点的个数7.查找x所在的节点8.树的销毁9.相关题目9.1相同的树9.2单值二叉树9.3对称二叉树9.4二叉树的构建9.5翻转二叉树9.6另一颗树的子树 10…

Learn OpenGL 17 立方体贴图

立方体贴图 我们已经使用2D纹理很长时间了&#xff0c;但除此之外仍有更多的纹理类型等着我们探索。在本节中&#xff0c;我们将讨论的是将多个纹理组合起来映射到一张纹理上的一种纹理类型&#xff1a;立方体贴图(Cube Map)。 简单来说&#xff0c;立方体贴图就是一个包含了…

Java基础夯实——八股文【2024面试题案例代码】

1、Java当中的基本数据类型 Java中常见的数据类型及其对应的字节长度和取值范围如下&#xff1a; byte&#xff1a;1字节&#xff0c;取值范围为-128到127。short&#xff1a;2字节&#xff0c;取值范围为-32,768到32,767。int&#xff1a;4字节&#xff0c;取值范围为-2,147…

【Greenhills】GHS-MULTI IDE-Ubuntu纯命令系统部署license文件

【更多软件使用问题请点击亿道电子官方网站查询】 1、 文档目标 记录在Ubuntu纯命令系统中部署license文件的步骤。 2、 问题场景 客户服务器为Linux纯命令行的环境&#xff0c;客户也无其他服务器可以部署&#xff0c;需在纯命令行上尝试安装。 3、软硬件环境 1&#xff09…

【Linux系统编程】进程程序替换

介绍&#xff1a; 进程程序替换是指将一个进程中正在运行的程序替换为另一个全新的程序的过程&#xff0c;但替换不是创建新进程&#xff0c;只是将对应程序的代码和数据进行替换。具体来说&#xff0c;这个替换过程涉及将磁盘中的新程序加载到内存结构中&#xff0c;并重新建立…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:FlowItem)

瀑布流组件的子组件&#xff0c;用来展示瀑布流具体item。 说明&#xff1a; 该组件从API Version 9开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。仅支持作为Waterflow组件的子组件使用。 子组件 支持单个子组件。 接口 FlowItem() 使…

【RK android6.0 实现假关机真开机效果】

RK android6.0 实现假关机真开机效果 需求描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip CPU:rk3368 OS:Android 7.1.2 Kernel: 3.10 需求描述 由于硬件设计&#xff0c;使用错误…

Qt实现简单的五子棋程序

Qt五子棋小程序 Qt五子棋演示及源码链接登陆界面单机模式联机模式联网模式参考 Qt五子棋 参考大佬中国象棋程序&#xff0c;使用Qt实现了一个简单的五子棋小程序&#xff0c;包含了单机、联机以及联网三种模式&#xff1b;单机模式下实现了简易的AI&#xff1b;联机模式为PtoP…

Verilog case/casez/casex的区别

casez/casex语句虽然EDA工具也可以综合出来&#xff0c;但是注意&#xff0c;casez/casex综合出来的电路和case语句综合出来的电路可能是不同的&#xff0c;一定要慎用。而且综合工具也会告诉你casez/casex中的“?”"x""z"的comparison is always false&a…

提速增效!Figma插件推荐,助你事半功倍!

随着设计工具的更换&#xff0c;设计师不再局限于传统软件的重复操作&#xff0c;而是越来越追求能够提高设计效率的插件。从Photoshop到Sketch&#xff0c;再到最受欢迎的Figma&#xff0c;插件层出不穷。Figma是一种基于浏览器和团队合作的设计工具&#xff0c;可以在任何平台…

HackTheBox Blackfield

[1] 靶机信息状态退役难度HardIP/地址https://app.hackthebox.com/machines/Blackfield价格需要订阅 14$ /20 $ /月 端口扫描 └──╼ #nmap -p- --min-rate1000 -T4 10.129.229.17 Starting Nmap 7.93 ( https://nmap.org ) at 2024-03-14 14:14 GMT Nmap scan report for…

【iOS】ARC学习

文章目录 前言一、autorelease实现二、苹果的实现三、内存管理的思考方式__strong修饰符取得非自己生成并持有的对象__strong 修饰符的变量之间可以相互赋值类的成员变量也可以使用strong修饰 __weak修饰符循环引用 __unsafe_unretained修饰符什么时候使用__unsafe_unretained …

JVM中对象创建过程

在JVM中对象的创建&#xff0c;我们从一个new指令开始&#xff1a; 这个过程大概图示如下&#xff1a; 虚拟机收到new指令触发。 类加载检查&#xff1a;如果类没有被类加载器加载&#xff0c;则执行类加载流程&#xff08;将class信息加载到JVM的运行时数据区的过程&#xff…

【SRE系列之docker容器】--dockerfile镜像优化

dockerfile镜像优化 1.1 镜像优化方法 系统镜像采用ubuntu或者alpine&#xff0c;会比centos少1G左右编写业务镜像时从官网拉取镜像&#xff0c;其余配置根据业务需求再配置编写dockerfile时把不用的安装包卸载或者删除尽量减少run命令的使用&#xff08;一个run命令&#xf…

《手把手教你》系列技巧篇(三十九)-java+ selenium自动化测试-JavaScript的调用执行-上篇(详解教程)

1.简介 在做web自动化时&#xff0c;有些情况selenium的api无法完成&#xff0c;需要通过第三方手段比如js来完成实现&#xff0c;比如去改变某些元素对象的属性或者进行一些特殊的操作&#xff0c;本文将来讲解怎样来调用JavaScript完成特殊操作。 2.用法 创建一个执行 JS 的…