[算法每日一练]-双指针 (保姆级教程篇 1) #A-B数对 #求和 #元音字母 #最短连续子数组 #无重复字符的最长子串 #最小子串覆盖 #方块桶

目录

A-B数对

解法一:双指针 

解法二:STL二分查找

解法三:map

求和

元音字母

最短连续子数组

无重复字符的最长子串

最小子串覆盖

方块桶


        

双指针特点:双指针绝不回头

        

        

A-B数对

        

解法一:双指针 

 先把数列排列成递增的就可以使用双指针了。找到满足a[r]-a[l]=c即可

 对每个l找对应的两个r,一个是满足条件且在最左边的,一个是满足条件且在最右边的

 如果刚好可以取等,那么右减左就是该情况下的答案,否则右减左就是0

#include <bits/stdc++.h>            
#define ll long long      
using namespace std;       
const int N = 2e5 + 10;
int n , c;
int a[N];
int main () 
{cin >> n >> c;for(int i = 1 ; i <= n ; i ++) cin >> a[i];sort(a + 1 , a + 1 + n);      //首先就必须要排序int l = 1, r1 = 1 , r2 = 1;ll ans = 0;for(l = 1 ; l <= n ; l ++) {while(r1 <= n && a[r1] - a[l] <= c) r1 ++;//对每一个数A找右边刚不满足A-B=C的数下标while(r2 <= n && a[r2] - a[l] < c ) r2 ++;//再找左边刚满足A-B=C的数下标ans += r1 - r2;}cout << ans;return 0;
}

解法二:STL二分查找

在有序数组找某个数不用stl用什么?

#include <bits/stdc++.h>
using namespace std;
int N, C, A[200010];int main() {scanf( "%d%d", &N, &C );for( int i = 1; i <= N; ++i ) scanf( "%d", &A[ i ] );sort( A + 1, A + N + 1 );long long ans = 0;for( int i = 1; i <= N; ++i ) ans += upper_bound( A + 1, A + N + 1, A[ i ] - C ) - lower_bound( A + 1, A + N + 1, A[ i ] - C );printf( "%lld\n", ans );return 0;
}

解法三:map

既然要同一个值得数量,那么就拿数值存下标,说错了。这样会爆掉的,直接上map进行离散化数组就行了,什么意思?就是你别拿一个连续的玩意去存,你拿一个离散的东西去存就行了。

#include <iostream>             //A-B数对P1102   (map映射法)   (有点耗时)
#include <unordered_map>                  //A-B=C --> A-C=B
using namespace std;
typedef long long LL;
LL a[200001];
unordered_map<LL,LL> m;       //建立一个数字到出现次数的映射 map<num,times>
int main() {int n; LL c;LL ans=0;cin >> n >> c;    for(int i=1;i<=n;i++) {cin >> a[i];    m[a[i]]++;     //标记每个数字和对应的映射a[i]-=c;       //把first减c,找更新后映射的数量} for(int i=1;i<=n;i++) ans+=m[a[i]];cout << ans << endl;return 0;
}

        

         

求和

求满足和为x所有的自然数区间,如果没有输出No

        

思路:

对每个l开头的区间尝试求解。

双指针移动时:[l,r]恰好为x就说明[l,r+1]和[l+1,r]没用了,所以整体右移l++,r++

[l,r]<x就r右移,[l,r]>x就l右移(这次的l已经没用了)

然后就是注意一下结束条件l<=x/2

#include <bits/stdc++.h>
using namespace std;
int main(){int x,l=1,r=2,sum=0;cin>>x;int f=0;while(l<=x/2){ //这个结束条件很有意思:l<=x/2就没必要再找了sum=(l+r)*(r-l+1)/2;if(sum==x){f=1;cout<<l<<" "<<r<<'\n';l++;r++;}else if(sum<x)r++;else l++;}if(!f)cout<<"No";
}

        

        

元音字母

给一个字符串s和整数k,求s的长度为k的子串可能包含的最大元音字母个数

输入                             输出:3
abciiidef

        

思路:

[l,r]一定是整体移动的,所以只需要观察l和r+1情况即可,如果都是或都不是,cnt不变直接不管;剩下的就是cnt++和cnt--了

#include <bits/stdc++.h>
using namespace std;
int check(char ch){if(ch=='a'||ch=='e'||ch=='i'||ch=='o'||ch=='u')return true;return false;
}
int main(){string s;int k;cin>>s>>k;int l=0,r=k-1,ans=0,cnt=0,len=s.size();for(int i=0;i<k;i++){if(check(s[i]))cnt++;//初始化}ans=cnt;while(r<len){//整体移动一次就判断一次if(!check(s[l])&&check(s[r+1]))cnt++;if(check(s[l])&&!check(s[r+1]))cnt--;l++;r++;ans=max(ans,cnt);}cout<<ans;
}

        

        

最短连续子数组

给一个含有n个非负数的数组和一个正整数m。找出该数组中满足和不小于m的长度最小的连续子数组,并返回其长度,否则返回0

输入                 输出:2
6 7
2 3 1 2 4 3

        

思路:

 在移动过程中[l,r]如果满足条件的话,一定要l++来取最小长度,否则就r++即可。

(一直都是r在默默前行,l只需要统计结果即可)

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,m,a[N],ans=0x3f3f3f3f;int main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}int sum=0;for(int l=0,r=0;r<=n;r++){sum+=a[r];while(sum>=m){ans=min(ans,r-l+1);sum-=a[l];l++;}}cout<<(ans==0x3f3f3f3f ? 0 : ans);
}

        

        

无重复字符的最长子串

给一个字符串s,找出其中不含有重复字符的最长字串的长度。
abcabcbb

        

思路:

 首先使用map<char,int>来统计每个字符出现次数,一遍统计一遍检查是否有重复字符。

如果有,对于[l,r]就l++,直到没有再r++


#include <bits/stdc++.h>
using namespace std;
unordered_map<char,int>ma1;
string s;
int ans=0;
int main(){getline(cin,s);int len1=s.size();for(int l=0,r=0;r<len1;r++){ma1[s[r]]++;while(ma1[s[r]]==2){ma1[s[l]]--;l++;}ans=max(ans,r-l+1);}cout<<ans;
}

        

        

最小子串覆盖

给两个字符串s,t,求s中最短的包含t每一个字符的子串,若不存在就返回No
输入

ADOBECODEANXBC                输出ANXBC
BANC

        

思路:

不是找子序列啊,注意看样例。

首先要统计t字符串的字符情况,然后在对s字符串使用双指针时候,也要统计区间中的字符情况,同时记录和t字符串的字符满足个数:对应字符数量相等。

当[l,r]中已经满足条件时候,就l++取找答案,同时对应的字符数量减一,直到不满足再r++。

        

#include <bits/stdc++.h>
using namespace std;
unordered_map<char,int>ma1,ma2;
string s,t;
int ans=0x3f3f3f3f;
int main(){cin>>s>>t;int len1=s.size(),len2=t.size();for(int i=0;i<len2;i++)ma2[t[i]]++;int sum=0;//sum表示满足的个数int l=0,r=0,ll=0,rr=0;while(r<len1){ma1[s[r]]++;if(ma2[s[r]]!=0&&ma1[s[r]]<=ma2[s[r]])//是t的字符,且s的数量不多余sum++;if(sum==len2){while(ma1[s[l]]>ma2[s[l]]){//从左开始删掉多余的,l++一次删掉一次ma1[s[l]]--;l++;}if(r-l+1<ans){ans=r-l+1;ll=l;rr=r;//ll和rr是上次答案对应的左右指针}}r++;}	if(ans==0x3f3f3f3f) cout<<"No";elsecout<<s.substr(ll,rr-ll+1);
}

        

        

方块桶

给n个非负整数表示连续n个竖直放置的方块,计算这样的方块可以装多少水?
12
0 1 0 2 1 0 1 3 2 1 2 1

        

思路:

其实在模拟的时候发现左边这个高度下是否可以填水取决于右边的最大高度,右边更高,那么一定可以填水,右边同理。然后两条同时开始统计就行了

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int n,a[N],maxl,maxr,ans;
int main(){cin>>n;for(int i=1;i<=n;i++)cin>>a[i];maxl=a[1],maxr=a[n];int l=1,r=n;while(l<r){if(maxl<=maxr){l++;maxl=max(maxl,a[l]);ans+=maxl-a[l];}else{r--;maxr=max(maxr,a[r]);ans+=maxr-a[r];}}cout<<ans;
}

        

        

         

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

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

相关文章

Grounding DINO、TAG2TEXT、RAM、RAM++论文解读

提示&#xff1a;Grounding DINO、TAG2TEXT、RAM、RAM论文解读 文章目录 前言一、Grounding DINO: Marrying DINO with Grounded Pre-Training for Open-Set Object Detection1、摘要2、背景3、部分文献翻译4、贡献5、模型结构解读a.模型整体结构b.特征增强结构c.解码结构 6、实…

使用Sourcetrail解析C项目

阅读源码的工具很多&#xff0c;今天给大家推荐一款别具一格的源码阅读神器。 它就是 Sourcetrail&#xff0c;一个免费开源、跨平台的可视化源码探索项目 使用

Faster R-CNN pytorch源码血细胞检测实战(二)数据增强

Faster R-CNN pytorch源码血细胞检测实战&#xff08;二&#xff09;数据增强 文章目录 Faster R-CNN pytorch源码血细胞检测实战&#xff08;二&#xff09;数据增强1. 资源&参考2. 数据增强2.1 代码运行2.2 文件存放 3 数据集划分4. 训练&测试5. 总结 1. 资源&参…

静态SOCKS5的未来发展趋势和新兴应用场景

随着网络技术的不断发展和进步&#xff0c;静态SOCKS5代理也在不断地完善和发展。未来&#xff0c;静态SOCKS5代理将会呈现以下发展趋势和新兴应用场景。 一、发展趋势 安全性更高&#xff1a;随着网络安全问题的日益突出&#xff0c;用户对代理服务器的安全性要求也越来越高…

【华为鸿蒙系统学习】- HarmonyOS4.0开发|自学篇

​ &#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 &#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 目录 HarmonyOS 4.0 技术介绍&#xff1a; HarmonyOS三大特征&#xff1a; 1.实现硬件互助&#…

Appium 并行测试多个设备

一、前置说明 在自动化测试中&#xff0c;经常需要验证多台设备的兼容性&#xff0c;Appium可以用同一套测试运例并行测试多个设备&#xff0c;以达到验证兼容性的目的。 解决思路&#xff1a; 查找已连接的所有设备&#xff1b;为每台设备启动相应的Appium Server&#xff1b…

docker的资源控制:

docker的资源控制&#xff1a; 对容器的使用宿主机的资源进行限制 cpu 内存 磁盘i/0 docker使用linux自带的功能cgroup control grouos是linux内核系统提供的一种可以限制&#xff0c;记录&#xff0c;隔离进程所使用的物理资源 control grouos是linux内核系统提供的一种可…

HeartBeat监控Mysql状态

目录 一、概述 二、 安装部署 三、配置 四、启动服务 五、查看数据 一、概述 使用heartbeat可以实现在kibana界面对 Mysql 服务存活状态进行观察&#xff0c;如有必要&#xff0c;也可在服务宕机后立即向相关人员发送邮件通知 二、 安装部署 参照章节&#xff1a;监控组件…

每日一博 - 图解5种Cache策略

文章目录 概述读策略Cache AsideRead Through 写策略Write ThroughWrite AroundWrite Back 使用场景举例 概述 缓存是在系统中存储数据的临时存储器&#xff0c;用于提高访问速度。缓存策略定义了如何在缓存和主存之间管理数据 读策略 Read data from the system: &#x1f5…

vue3原生方法滚动列表

效果图 代码 import { ref, onBeforeUnmount, onUnmounted } from "vue"; //定时器初始化 let timer ref(null); //ref绑定初始化 let roll ref(null); //等同于vue2中的beforeDestroy onBeforeUnmount(() > {//清除定时器clearTimeout(timer.value); }); //等同…

AGI时代探导开发的智能化落地之路:中国企业低代码及无代码应用价值报告V6

今天分享的AGI系列深度研究报告&#xff1a;《AGI时代探导开发的智能化落地之路&#xff1a;中国企业低代码及无代码应用价值报告V6》。 &#xff08;报告出品方&#xff1a;甲子光年智库&#xff09; 报告共计&#xff1a;47页 点击添加图片描述&#xff08;最多60个字&…

机器学习与人工智能:一场革命性的变革

机器学习与人工智能&#xff1a;一场革命性的变革 人工智能的概述什么是机器学习定义解释 数据集结构机器学习应用场景 人工智能的概述 1956年8月&#xff0c;在美国汉诺斯小镇宁静的达特茅斯学院中&#xff0c;约翰麦卡锡&#xff08;John McCarthy&#xff09;、马文闵斯基&…

数据链路层的作用和三个基本问题

目录 一. 数据链路层的作用二. 数据链路层解决的三个问题2.1 数据链路和帧2.2 三个基本问题(重要)2.2.1 封装成帧2.2.2 透明传输2.2.3 差错检测 \quad 一. 数据链路层的作用 \quad \quad \quad 光有链路不能传输数据, 还要加上协议, 这样才是数据链路 数据链路层的作用就是负责…

RHEL8_Linux虚拟数据优化器VDO

本章主要介绍虚拟化数据优化器 什么是虚拟数据优化器VDO创建VDO设备以节约硬盘空间 1.了解什么是VDO VDO全称是Virtual Data Optimize&#xff08;虚拟数据优化)&#xff0c;主要是为了节省硬盘空间。 现在假设有两个文件file1和 file2&#xff0c;大小都是10G。file1和 fil…

.NET 材料检测系统崩溃分析

Windbg 分析 1. 到底是哪里的崩溃 一直跟踪我这个系列的朋友应该知道分析崩溃第一个命令就是 !analyze -v &#xff0c;让windbg帮我们自动化异常分析。 0:033> !analyze -v CONTEXT: (.ecxr) rax00000039cccff2d7 rbx00000039c85fc2b0 rcx00000039cccff2d8 rdx000000000…

洛谷P3807 Lucas定理

传送门&#xff1a; P3807 【模板】卢卡斯定理/Lucas 定理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P3807题干&#xff1a; 给定整数n,m,p 的值&#xff0c;求出C&#xff08;nm&#xff0c;n&#xff09;​mod p 的值。 输入数据保证…

5分钟搞懂K8S Pod Terminating/Unknown故障排查

Kubernetes集群中的Pod有时候会进入Terminating或Unknown状态&#xff0c;本文列举了6种可能的原因&#xff0c;帮助我们排查这种现象。原文: K8s Troubleshooting — Pod in Terminating or Unknown Status 有时我们会看到K8S集群中的pod进入"Terminating"或"U…

每日一练【查找总价格为目标值的两个商品】

一、题目描述 题目链接 购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况&#xff0c;返回任一结果即可。 示例 1&#xff1a; 输入&#xff1a;price [3, 9, 12, 15], target 18 输出&#xff1a;[3,15] …

成都工业学院Web技术基础(WEB)实验一:HTML5排版标签使用

写在前面 1、基于2022级计算机大类实验指导书 2、代码仅提供参考&#xff0c;前端变化比较大&#xff0c;按照要求&#xff0c;只能做到像&#xff0c;不能做到一模一样 3、图片和文字仅为示例&#xff0c;需要自行替换 4、如果代码不满足你的要求&#xff0c;请寻求其他的…

Gemini与GPT-4的巅峰对决:AI界的双壁之战

随着人工智能技术的飞速发展&#xff0c;AI领域的竞争越来越激烈。在这个充满挑战与机遇的时代&#xff0c;两个备受瞩目的AI巨头——Gemini Pro和GPT-4&#xff0c;成为了人们关注的焦点。这两者都以其强大的功能和卓越的性能&#xff0c;引领着AI领域的发展潮流。本文将详细介…