蓝桥省赛倒计时 35 天-双指针

news2024/10/1 12:23:31

双指针介绍

双指针算法是一种常用的算法技巧,它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 pointer
双指针并非真的用指针实现,一般用两个变量来表示下标(在后面都用指针来表示)。
双指针算法使用两个指针在数据结构上进行迭代,并根据问题的要求移动这些指针。
双指针往往也和单调性、排序联系在一起,在数组的区间问题上,暴力法的时间复杂度往往是O(n^2)的,但双指针利用“单调性”可以优化到O(n)。
常见的双指针模型有: 1)对撞指针 2)快慢指针

对撞指针

指的是两个指针left、right(简写为1,r)分别指向序列第一个元素和最后一个元素。然后1指针不断递增,r不断递减,直到两个指针的值相撞或错开(即1>=r),或者满足其他
要求的特殊条件为止。 对撞指针一般用来解决有序数组或者字符串问题(常见于区间问题):
查找有序数组中满足某些约束条件的一组元素问题:比如二分查找、数字之和等问题。字符串反转问题:反转字符串、回文数、颠倒二进制等问题。

  1. 使用两个指针left,right。left指向序列第一个元素,即:left=1,right指向序列最后 一个元素,即:right= n。
  2. 在循环体中将左右指针相向移动,当满足一定条件时,将左指针右移,left++。当满足另 外一定条件时,将右指针左移,right-。
  3. 直到两指针相撞(即left==right),或者满足其他要求的特殊条件时,跳出循环体。
    在这里插入图片描述

回文判定

在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

string s;

int main( ){
    cin>>s;
    unsigned long i = 0,j = s.length()-1;
    bool flag = true;
    while(i<j&&flag){
        if(s[i]!=s[j])flag = false;
        i++,j--;
    }
    cout<<(flag==true?"Y":"N")<<endl;
    return 0;
}

快慢指针

快慢指针一般比对撞指针更难想,也更难写 指的是两个指针从同一侧开始遍历序列,且移动的步长一个快一个慢。
移动快的指针被称为快指针,移动慢的指针被称为慢指针。
为了方便理解,我们成快指针为r,慢指针为l,这样慢指针和快指针构成区间[l,r]。两个指针以不同速度、不同策略移动,直到快指针移动到数组尾端,或者两指针相交,或老
满足其他特殊条件时为止。
在这里插入图片描述

lanqiao OJ 1372 美丽的区间

在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
int n,S;

int main( ){
    cin>>n>>S;
    vector<int> arr(n);
    
    for(int i=1;i<=n;i++)cin>>arr[i];
    int res = n+1;
    for(int i=1,j=0,sum=0;i<=n;i++){
        while(i>j||(j+1<=n&&sum<S))sum+=arr[++j];
        if(sum>=S)res = min(res,j-i+1);
        sum-=arr[i];
    }
    cout<<(res>n?0:res)<<'\n';
    return 0;
}

lanqiao OJ 1621 挑选子串

在这里插入图片描述

#include<bits/stdc++.h>

using namespace std;

int n,m,k;

int main( ){
    cin>>n>>m>>k;
    vector<int>a(n);
    for(int i=1;i<=n;i++)cin>>a[i];
    long long ans = 0;
    for(int i=1,j=0,cnt=0;i<=n;i++){
        while(i>j||(j+1<=n&&cnt<k)){
            if(a[++j]>=m){
                cnt++;
            }
        }
        if(cnt>=k)ans+=n-j+1;
        if(a[i]>=m)cnt--;
    }
    cout<<ans<<endl;
    return 0;
}

蓝桥杯2023年第十四届省赛真题-子串简写

在这里插入图片描述
解法一:双指针

#include<bits/stdc++.h>

using namespace std;

string s;
int k,cnt;
char c1,c2;
long long ans;

int main( ){
    cin>>k>>s>>c1>>c2;
    unsigned long n = s.length();
    for(int i=0,j=k-1;j<n;i++,j++){
        if(s[i]==c1)cnt++;
        if(s[j]==c2)ans+=cnt;
    }
    cout<<ans<<endl;
    return 0;
}

解法二:前缀和

#include<bits/stdc++.h>

using namespace std;

string s;
int k,cnt,t;
char c1,c2;
long long ans;

int main( ){
    cin>>k>>s>>c1>>c2;
    unsigned long n = s.length();
    vector<int>sum(n);
    
    for(int i=0;i<n;i++){
        if(s[i]==c1)t++;
        sum[i]=t;
        if(s[i]==c2&&i>=k-1)ans+=sum[i-k+1];
    }
    cout<<ans<<endl;
    return 0;
}

解法三:二分

#include<bits/stdc++.h>

using namespace std;

string s;
int k,cnt,t;
char c1,c2;
long long ans;

int main( ){
    cin>>k>>s>>c1>>c2;
    unsigned long n = s.length();
    vector<int> st,ed;
    for(int i=0;i<n;i++){
        if(s[i]==c1)st.push_back(i);
        if(s[i]==c2)ed.push_back(i);
    }
    for(int i=0;i<st.size();i++){
        int x = st[i];
        int X = x+k-1;
        int l=0,r=ed.size()-1;
        while(l<r){
            int mid = (l+r)>>1;
            if(ed[mid]>=X)r=mid;
            else l=mid+1;
        }
        if(ed[l]>=X)ans+=ed.size()-l;
    }
    cout<<ans<<endl;
    return 0;
}

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

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

相关文章

【Java JVM】Class 文件

Java 的口号 “一次编写, 到处运行 (Write Once, Run Anywhere)” 的基础: JVM 和 所有平台都统一支持的程序存储格式 – 字节码 (Byte Code)。 只要在对应的平台安装对应的 JVM, 将我们编写的源码编译为 Class 文件, 就能达到了一次编写, 导出运行的目标, 中间的所有细节由不同…

0103n阶行列式-行列式-线性代数

文章目录 一 n阶行列式二 三阶行列式三 特殊行列式结语 一 n阶行列式 ∣ a 11 a 12 ⋯ a 1 n a 21 a 22 ⋯ a 2 n ⋯ ⋯ ⋯ ⋯ a n 1 a n 2 ⋯ a n n ∣ \begin{vmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\cdots&\cdots…

大型房企知识竞赛活动方案

&#xff08;一&#xff09; 线上挑战赛 1、加入团队 个人可以依据自身情况选择加入初始团队&#xff0c;也可创建团队。 2、题库来源 参考权威题库&#xff0c;适当加入公司帮扶贫困县的相关历史数据题目 3、小程序活动专题页 模块包括&#xff1a;党史知识线上挑战赛、活动宣…

Unity 采用自定义通道ShaderGraph实现FullScreen的窗户雨滴效果

效果如下 ShaderGraph实现 N21 随机化 DragLayer分层 将DragLayer分成四层&#xff0c;分别调整每层的缩放和大小 Shader实现的链接&#xff08;Unity 雨水滴到屏幕效果&#xff09; 我也是参考这个实现Shader Graph

Android7.1 ANR error 弹窗处理

Android7.1 ANR error 弹窗处理 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 有时会用到第三方apk&#xff0c;内置到系统中&…

通信-CAN-00 标准概述

总结了下CAN的基本知识&#xff0c;实际CAN的标准&#xff0c;内容&#xff0c;工具使用&#xff0c;上位机开发&#xff0c;下位机开发等&#xff0c;后续会找时间慢慢更新。本文主要介绍CAN标准&#xff0c;并对11898进行了进一步的介绍。 1 CAN概念 CAN-Controller Area N…

C++ 多状态dp

目录 按摩师 打家劫舍 打家劫舍2 删除并获得点数 粉刷房子 按摩师 面试题 17.16. 按摩师 最大值问题 f : 预约此次的最长时间 g &#xff1a;不预约此次的最长时间 出现的错误&#xff1a;return max(f[n - 1]), g[n - 1]); 注意&#xff1a;①题目没给nums的范围&…

软件杯 图像识别-人脸识别与疲劳检测 - python opencv

文章目录 0 前言1 课题背景2 Dlib人脸识别2.1 简介2.2 Dlib优点2.3 相关代码2.4 人脸数据库2.5 人脸录入加识别效果 3 疲劳检测算法3.1 眼睛检测算法3.3 点头检测算法 4 PyQt54.1 简介4.2相关界面代码 5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是…

【C++】深度解剖多态

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是多态&#xff0c;熟练掌握多态的定义&a…

预约自习室

预约自习室 1、技术介绍 自习室预约系统的后端开发语言采用Node&#xff0c;后端开发框架采用Express&#xff0c;数据库采用的Node的最佳搭档MySQL。采用Vue作为前端开发框架&#xff0c;Element-UI作为开发的组件库&#xff0c;微信小程序。期间采用axios实现网页数据获取&a…

[java入门到精通] 19 网络编程,设计模式

今日目标 网络编程 TCP通信 Junit单元测试 单例设计模式 多例设计模式 工厂设计模式 1 网络编程 1.1 软件架构 C/S结构 &#xff1a;全称为Client/Server结构&#xff0c;是指客户端和服务器结构。常见程序有&#xff31;&#xff31;、迅雷等软件B/S结构 &#xff1a…

Biomedical knowledge graph-enhanced prompt generation for large language models

1. 生物医学知识图谱增强大语言模型提示生成 论文地址&#xff1a;[2311.17330] Biomedical knowledge graph-enhanced prompt generation for large language models (arxiv.org) 源码地址&#xff1a;https://github.com/BaranziniLab/KG_RAG 2. 摘要 大语言模型&#xff0…

MySQL--索引优化实战篇(1)

前言&#xff1a; 我们常说的SQL优化&#xff0c;简单来说就是索引优化&#xff0c;通过合理创建索引&#xff0c;调整SQL语法等&#xff0c;来提升查询效率&#xff0c;想要进行SQL优化&#xff0c;就必须知道索引的原理&#xff0c;而且能够看懂SQL的执行计划。 MySQL–索引…

基于springboot的校园二手交易平台(程序+数据库+文档)

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

STM32OLED调试工具

OLED介绍 4个引脚的oled &#xff1a; GND引脚接地&#xff0c;VCC接3.3v的电源 SCL与SDA是I2C通信的引脚 使用OLED显示屏驱动函数模块 接线图 将oled函数调试的代码引入到工程项目中 oled工程代码 OLED.C文件代码 #include "stm32f10x.h" #include "OLED_Font…

论文笔记 Where Would I Go Next? Large Language Models as Human Mobility Predictor

arxiv 2023 08的论文 1 intro 1.1 人类流动性的独特性 人类流动性的独特特性在于其固有的规律性、随机性以及复杂的时空依赖性 ——>准确预测人们的行踪变得困难近期的研究利用深度学习模型的时空建模能力实现了更好的预测性能 但准确性仍然不足&#xff0c;且产生的结果…

【Python数据结构与判断1/7】复杂的多向选择

目录 导入 举个栗子 代码优化 elif 栗子 执行顺序 情况一 情况二 情况三 if-elif-else特性 三种判断语句小结 if if-else if-elif-else 嵌套语句 if嵌套 栗子 执行顺序 相互嵌套 Tips Debug 总结 导入 在前面&#xff0c;我们学习了单向选择的if语句和多项…

超越α!PixArt家族新秀PixArt-Σ: 由弱到强训练的文本生成4K图像DiT(华为诺亚)

文章链接&#xff1a; https://arxiv.org/pdf/2403.04692 开源地址&#xff1a;https://pixart-alpha.github.io/PixArt-sigma-project/ PixArt-Σ&#xff0c;这是一个能够直接生成4K分辨率图像的Diffusion Transformer&#xff08;DiT&#xff09;。PixArt-Σ相比其前身PixAr…

【unity实战】3D水系统,游泳,潜水,钓鱼功能实现

最终效果 文章目录 最终效果素材将项目升级为URP画一个水潭地形材质升级为URP创建水调节水第一人称人物移动控制游泳水面停留添加水下后处理水下呼吸钓鱼参考完结 素材 https://assetstore.unity.com/packages/vfx/shaders/urp-stylized-water-shader-proto-series-187485 将…

06 数据结构之树

引言&#xff1a; 数的代码实现&#xff0c; 先序遍历、中序、后序、层次遍历 /* binary_tree.h */ #ifndef _BINARY_TREE_H #define _BINARY_TREE_H#include <stdio.h> #include <stdlib.h> #include <string.h>#define DEBUG(msg) \printf("--%s--, %…