数据结构-双指针法

介绍 

双指针法是一种可以在O(n)时间复杂度内解决数组、链表、字符串等数据结构相关的问题的方法。核心思想为使用两个指针在不同位置遍历数组或链表,从而实现特定操作。

常见的双指针法有

1.快慢指针:快指针每次移动两步,慢指针移动一步,用于判断链表是否有环或者找到链表中间结点等;

2.左右指针:左指针指向数组开头,右指针指向结尾,用于解决二分查找、两数之和等等;

3.滑动窗口:维护一个特定窗口,用两个指针表示左右边界,寻找符号要求的子序列;

4.对撞指针:左指针从起始位置开始遍历,右指针从末尾遍历,满足条件的情况下移动左右指针,用于解决回文串等问题

滑动窗口指针例题

洛谷P1638 逛画展

42b60f2acde247d0b51118293f385b30.png

我们需要用两个指针来维护一个没有最小的、具备所有画师作品的子序列,首先就需要先设置左指针指在开头,右指针不断向右移动,每次移动后判断是否满足具备所有画师作品,再找出其中最短的子序列

#include <bits/stdc++.h>
using namespace std;
int a[1000001];
int b[10000]={0};
int main() {int n,m;cin>>n>>m;int res=1,len=n;int s,e;for (int i=1; i<=n; i++) cin>>a[i];int l=0;//从左端开始寻找int r=0;b[a[0]]=1;while(r<=n&&l<=r) {//在所有样例中开始用滑动窗口查找if (res==m) {//当具备所有画师画作时if (len>r-l+1) {//找出最小区间并记录。题中要求找出第一个最小区别,因此不加等号len=r-l+1;s=l;e=r;}b[a[l]]--;//窗口向左边缩进,继续向右寻找if (b[a[l]]==0) res--;l++;} else {r++;//当不具备所有画师画作时,窗口向右延展if (b[a[r]]==0) res++;b[a[r]]++;}}cout<<s+1<<" "<<e+1;return 0;
}

洛谷P8783 [蓝桥杯2022省B]统计子矩阵 

4918477986a94e65ae31b49361fd0c46.png

这道题目难点在于能想到将它压缩为一维数列,当压缩为一维数列时,利用滑动窗口可以实现符号要求的子序列的查找。每次寻找的符合要求的边界,直接加上其中的子矩阵数,就可以得到总数

#include <bits/stdc++.h>
using namespace std;
long long a[501][501];//注意数据类型
long long b[501];
long long sum[510][510];//记录前缀和
signed main() {long long n,m,k;cin>>n>>m>>k;for (long long i=1; i<=n; i++) {for (long long j=1; j<=m; j++) {cin>>a[i][j];}}for (long long j=1; j<=m; j++) {for (long long i=1; i<=n; i++) {sum[i][j]=sum[i-1][j]+a[i][j];//计算前缀和}}long long res=0;for (long long i=1; i<=n; i++) {for (long long j=i; j<=n; j++) {for (long long c=1; c<=m; c++)b[c]=sum[j][c]-sum[i-1][c];long long l=1,r=0;//开始利用双指针寻找子矩阵long long s=0;//记录所找矩阵中数值总和while(r<m) {r++;s+=b[r];if (s<=k) {//小于等于目标值,则继续移动res+=r-l+1;//每次移动,多出的满足条件的矩阵数为r-l+1} else {while(s>k) {//和大于时目标值,窗口从左边进行压缩s-=b[l];l++;}res+=r-l+1;}}}}cout<<res<<endl;return 0;
}

 

 

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

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

相关文章

AI:131- 法律文件图像中的隐含信息挖掘与敲诈勒索检测

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

天锐绿盾|防泄密系统|计算机文件数据\资料安全管理软件

“天锐绿盾”似乎是一款专注于防泄密和计算机文件数据/资料安全管理的软件。在信息安全日益受到重视的今天&#xff0c;这样的软件对于保护企业的核心数据资产和防止敏感信息泄露至关重要。 通用地址&#xff1a;www.drhchina.com 防泄密系统的主要功能通常包括&#xff1a; 文…

[前端开发] 常见的 HTML CSS JavaScript 事件

代码示例指路 常见的 HTML、CSS、JavaScript 事件代码示例 常见的 HTML CSS JavaScript 事件 事件HTML 事件鼠标事件键盘事件表单事件 JavaScript 事件对象事件代理&#xff08;事件委托&#xff09; 事件 在 Web 开发中&#xff0c;事件是用户与网页交互的重要方式之一。通过…

LeetCode405. Convert a Number to Hexadecimal

文章目录 一、题目二、题解 一、题目 Given an integer num, return a string representing its hexadecimal representation. For negative integers, two’s complement method is used. All the letters in the answer string should be lowercase characters, and there …

二进制和进制转换

前言 我们经常能听到2进制、8进制、10进制、16进制这样的讲法&#xff0c;那是什么意思呢&#xff1f;其实2进制、8进 制、10进制、16进制是数值的不同表示形式而已。 比如&#xff1a;数值15的各种进制的表示形式&#xff1a; 15的2进制&#xff1a;111115的8进制&#xff1…

阅读笔记(BMSB 2018)Video Stitching Based on Optical Flow

参考文献 Xie C, Zhang X, Yang H, et al. Video Stitching Based on Optical Flow[C]//2018 IEEE International Symposium on Broadband Multimedia Systems and Broadcasting (BMSB). IEEE, 2018: 1-5. 摘要 视频拼接在计算机视觉中仍然是一个具有挑战性的问题&#xff0…

完成端口的看法

很早之前使用过完成端口&#xff0c;当时觉得是很不错的技术。但是后来发现用的地方并不多&#xff0c;对它也有些自己的想法&#xff0c;仁者见仁智者见智。 应用场景上&#xff0c; 个人觉得&#xff0c;iocp有些鸡肋&#xff0c;一般的应用用不上&#xff0c;复杂的程序…

wps使用方法(包括:插入倒三角符号,字母上面加横线,将word中的所有英文设置为time new roman)

倒三角符号 字母上面加横线 将word中的所有英文设置为time new roman ctrla选中全文

语音唤醒——

文章目录 配置主代码 参考文档&#xff1a;https://picovoice.ai/docs/quick-start/porcupine-python/ 配置 pip install pvporcupine主代码 ACCESS_KEY&#xff1a;需要将该参数填入即可 # # Copyright 2018-2023 Picovoice Inc. # # You may not use this file except in …

人机协同中的感应与响应

人机协同中的感应与响应是指人与机器之间的互动过程中&#xff0c;机器对人的动作、行为、情感等进行感知&#xff0c;并根据这些感知信息作出相应的反应。感应是指机器能够通过传感器、摄像头等设备感知到人的动作、语音、表情等信息&#xff0c;将其转化为数字信号或数据&…

MySQL事务的概念

一、事务定义 事务&#xff1a;事务是一个最小的不可在分的工作单元&#xff1b;通常一个事务对应一个完整的业务(例如银行账户转账业务&#xff0c;该业务是一个最小的工作单元)一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。事务只和DML语句有关&a…

Java基于微信小程序的医院挂号小程序,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Jenkins 2.426.3新版设置中文

1. 插件页面显示无法联网 &#xff0c;点击Plugins一直提示连接超时&#xff0c;设置公司代理后 2. 稍等一会儿点击如下图&#xff0c;插件就出来了&#xff0c;然后输入Locale进行下载 3. 以下是我下载安装好的 4.打开设置&#xff0c;找到Locale选项&#xff0c;设置成zh_CN…

第13章 网络 Page738~741 13.8.3 TCP/UDP简述

libcurl是C语言写成的网络编程工具库&#xff0c;asio是C写的网络编程的基础类型库 libcurl只用于客户端&#xff0c;asio既可以写客户端&#xff0c;也可以写服务端 libcurl实现了HTTP\FTP等应用层协议&#xff0c;但asio却只实现了传输层TCP/UDP等协议。 在学习http时介绍…

305_C++_定义了一个定时器池 TimerPool 类和相关的枚举类型和结构体

头文件:定义了一个定时器池 TimerPool 类和相关的枚举类型和结构体 #ifndef TIMERPOOL_H #define TIMERPOOL_H #include "rsglobal.h" #include "taskqueue.h" #incl

【IO流】FileOutputStream 字节输出流

FileOutputStream 字节输出流 1. 概述2. 作用3. 书写步骤4. 构造方法5. 换行写6. 续写7. 注意事项 1. 概述 FileOutputStream 是 Java 中用于向文件写入字节数据的输出流类。它用于创建一个文件输出流&#xff0c;该流用于将数据写入文件。 功能&#xff1a;FileOutputStream …

C高级D5作业

1.#!/bin/bash read -p "请输入一个字符>>" -n 1 c echo case $c in [[:lower:]]) echo "小写" ;; [[:upper:]]) echo "大写" ;; [1-9]) echo "数字" ;; …

阿里云香港网络线路类型BGP(多线)精品延迟测试

阿里云香港等地域服务器的网络线路类型可以选择BGP&#xff08;多线&#xff09;和 BGP&#xff08;多线&#xff09;精品&#xff0c;普通的BGP多线和精品有什么区别&#xff1f;BGP&#xff08;多线&#xff09;适用于香港本地、香港和海外之间的互联网访问。使用BGP&#xf…

ChatGPT用于润色中文学术论文

方案一&#xff1a; 以下是一段用于润色中文学术论文的指令, 该指令可以生成一个表格, 第一列是润色前, 第二列是润色后, 第三列是解释做了什么修改。指令如下&#xff1a; As a Chinese academic paper writing improvement assistant, your task is to improve the spelling…

C++ //练习 7.27 给你自己的Screen类添加move、set和display函数,通过执行下面的代码检验你的类是否正确。

C Primer&#xff08;第5版&#xff09; 练习 7.27 练习 7.27 给你自己的Screen类添加move、set和display函数&#xff0c;通过执行下面的代码检验你的类是否正确。 Screen myScreen(5, 5, X); myScreen.move(4, 0).set(#).display(cout); cout<<"\n"; myScr…