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

双指针介绍

双指针算法是一种常用的算法技巧,它通常用于在数组或字符串中进行快速查找、匹配、排序或移动操作。 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.mfbz.cn/a/445435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android Gradle 开发与应用 (六) : 创建buildSrc插件和使用命令行创建Gradle插件

1. 前言 前文中&#xff0c;我们介绍了在Android中&#xff0c;如何基于Gradle 8.2&#xff0c;创建Gradle插件。这篇文章&#xff0c;我们以buildSrc的方式来创建Gradle插件。此外&#xff0c;还介绍一种用Cmd命令行的方式&#xff0c;来创建独立的Gradle插件的方式。 1.1 本…

第3集《天台教观纲宗》

乙二、约观行释 诸位法师慈悲&#xff01;陈会长慈悲&#xff01;诸位菩萨&#xff01;阿弥陀佛&#xff01; 请大家打开讲义第六页。我们看到乙二、约观行释。这一科是讲到天台教观的修学宗旨。 我们前面讲到&#xff0c;天台教观整个建立的过程&#xff0c;它是先有观法&a…

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--, %…

Tensorflow2.0+部署(tensorflow/serving)过程备忘记录Windows+Linux

Tensorflow2.0部署&#xff08;tensorflow/serving&#xff09;过程备忘记录 部署思路&#xff1a;采用Tensorflow自带的serving进模型部署&#xff0c;采用容器docker 1.首先安装docker 下载地址&#xff08;下载windows版本&#xff09;&#xff1a;https://desktop.docke…

python 蓝桥杯之动态规划入门

文章目录 DFS滑行&#xff08;DFS 记忆搜索&#xff09; 思路&#xff1a; 要思考回溯怎么写&#xff08;入参与返回值、递归到哪里&#xff0c;递归的边界和入口&#xff09; DFS 滑行&#xff08;DFS 记忆搜索&#xff09; 代码分析&#xff1a; 学会将输入的数据用二维列表…

WebMagic框架

1.webmagic框架 webmagic框架是一个Java实现的爬虫框架&#xff0c;底层依然是HttpClient和jsoup 组件&#xff1a; downloader&#xff1a;下载器组件PageProcessor&#xff1a;页面解析组件&#xff08;必须自定义&#xff09;scheculer&#xff1a;访问队列组件pipeline&am…

redis 性能优化一

目录 前言 尾延迟 前言 说到redis 性能优化&#xff0c;优化的目的是什么&#xff1f;提高响应&#xff0c;减少延迟。就要关注两点&#xff0c;一是尾延迟&#xff0c;二是Redis 的基线性能。只有指标&#xff0c;我们的优化&#xff0c;才有意义&#xff0c;才能做监控以及…

Java中常用的集合及方法(3)

1、List&#xff08;接上级--常用方法示例补充&#xff09; 1.4 常用的方法 1.4.2 LinkedList&#xff08;JDK8&#xff09; LinkedList是Java中一个实现了List接口和Deque接口的类&#xff0c;它采用链表结构存储数据&#xff0c;支持高效的插入和删除操作。 LinkedList中…

【C++】深度解剖多态

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

NIO学习总结(一)——简介、Channel、Buffer

相关代码地址&#xff1a;nio_demo_learn: nio学习相关代码 (gitee.com) 一、BIO、NIO和AIO 1.1 阻塞IO&#xff08;BIO&#xff09; BIO即同步阻塞IO&#xff0c;实现模型为一个连接就需要一个线程去处理。这种方式简单来说就是当有客户端来请求服务器时&#xff0c;服务器就…

分布式搜索elasticsearch

1.初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 elasticsearch是一款非常强大的开源搜索引擎&#xff0c;具备非常多强大功能&#xff0c;可以帮助我们从海量数据中快速找到需要的内容 例如&#xff1a; 在GitHub搜索代码 在电商网站搜索商品 在百度搜索答案…

MySQL主从读写分离之Proxysql(openEuler版)

实验目的&#xff1a; 基于proxysql实现MySQL的主从读写分离。 实验过程&#xff1a; 前期准备&#xff1a; 一共有四台虚拟机&#xff0c;其中三台为配置好的一主两从虚拟机&#xff0c;还有一台干净的虚拟机用来配置proxysql。 主机名地址master192.168.27.137node1192.…

NGINX源码安装详细配置文档

NGINX源码安装详细配置文档 一、基础Linux指令 查看nginx进程是否启动&#xff1a;ps -ef | grep nginx 关闭防火墙&#xff1a;systemctl stop firewalld 开放80端口&#xff1a;firewall-cmd --zonepublic --add-port80/tcp --permanent 关闭80端口&#xff1a;firewall-cmd …

(C语言)strcpy与strcpy详解,与模拟实现

目录 1. strcpy strcpy模拟实现&#xff1a; 实现方法1&#xff1a; 实现方法2&#xff1a; 2. strcat strcat模拟实现&#xff1a; 1. strcpy 作用&#xff1a;完成字符串的复制。 头文件&#xff1a;<string.h> destination是字符串要复制到的地点&#xff0c;s…

redis持久化-rdb

redis持久化-rdb策略 redis持久化rdb策略触发时机自动触发手动触发bgsave redis持久化 &#x1f680;我们知道redis是将数据存储在内存当中的&#xff0c;通常使用来作为关系型数据库的缓存使用的&#xff0c;以缓解当大量请求到来时关系型数据库的压力。 &#x1f680;既然数…

[LeetCode][226]翻转二叉树

题目 226. 翻转二叉树 给你一棵二叉树的根节点 root&#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1] 示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#x…

025—pandas 根多列判断不在其他列的数据

思路 是有两个相同结构的数据表&#xff0c;已知第二个表是第一个表的部分数据&#xff0c;需要以其中两列为单位&#xff0c;判断在第一个表中存在&#xff0c;在另外一个表中不存在的数据。 思路&#xff1a; 我们先将 df1 和 df2 的 x、y 列取出&#xff0c;组合为元组形成…

013 Linux_互斥

前言 本文将会向你介绍互斥的概念&#xff0c;如何加锁与解锁&#xff0c;互斥锁的底层原理是什么 线程ID及其地址空间布局 每个线程拥有独立的线程上下文&#xff1a;一个唯一的整数线程ID, 独立的栈和栈指针&#xff0c;程序计数器&#xff0c;通用的寄存器和条件码。 和其…

【Python】成功解决IndexError: list index out of range

【Python】成功解决IndexError: list index out of range &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得到您的订…

整除光棍(pta团体天梯练习题)模拟手算除法c++

这里所谓的“光棍”&#xff0c;并不是指单身汪啦~ 说的是全部由1组成的数字&#xff0c;比如1、11、111、1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如&#xff0c;111111就可以被13整除。 现在&#xff0c;你的程序要读入一个整数x&#xff0c;这个整数一定…
最新文章