数据结构-双指针法

news2025/1/22 15:44:00

介绍 

双指针法是一种可以在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.coloradmin.cn/o/1454772.html

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

相关文章

六个好用的Python库,绝对是瑰宝!

在当今的技术浪潮中&#xff0c;Python已经成为了一种广泛应用的编程语言。而要想充分发挥Python的威力&#xff0c;离不开各种优秀的库的支持。这些库能够提供丰富的功能和强大的工具&#xff0c;帮助开发者们更高效地完成各种任务。在本文中&#xff0c;笔者将介绍6个被誉为瑰…

流程编排(LogicFlow)

简介&#xff1a; LogicFlow 是一款流程图编辑框架&#xff0c;提供了一系列流程图交互、编辑所必需的功能和简单灵活的节点自定义、插件等拓展机制&#xff0c;方便我们快速在业务系统内满足类流程图的需求。 vue litefolw实现 liteflow-logicflow-vue实现 特性&#xff1a;…

数据库第四次实验

目录 1.建立数据表并插入数据 2 视图的创建 2.1 行列子集视图的创建 2.2 多表视图 2.3视图上建立视图 2.4分组视图 2.5带表达式的视图 3 删除视图 ​​​​​​​​​​​​​​4 查询视图 ​​​​​​​5 更新视图 5.1 修改某一个属性 5.2 删除一条数据 5.3 插入…

HTTP/1.1 如何优化?

问你一句:「你知道 HTTP/1.1 该如何优化吗?」 我们可以从下面这三种优化思路来优化 HTTP/1.1 协议: 尽量避免发送 HTTP 请求在需要发送 HTTP 请求时&#xff0c;考虑如何减少请求次数减少服务器的 HTTP 响应的数据大小 下面&#xff0c;就针对这三种思路具体看看有哪些优化…

力扣 第 385 场周赛 解题报告 | 珂学家 | 字典树专场

前言 整体评价 这是一场字典树专场&#xff0c;除了t3这个小模拟之外&#xff0c;1&#xff0c;2&#xff0c;4皆可用字典树搞定。 T4感觉做法挺多的&#xff0c;其实&#xff0c;但是字典树应该效率最高的。 T1. 统计前后缀下标对 I 思路: 模拟 O ( n 2 ) O(n^2) O(n2)全遍…

沁恒CH32V30X学习笔记03--64位systick

systick CH32F2x 系列产品Cortex-M3 内核自带了一个 24 位自减型计数器(SysTick timer)。支持 HCLK 或 HCLK/8 作为时基,具有较高优先级别(6)。一般可用于操作系统的时基。 CH32V3x 系列产品内核自带了一个 64 位加减计数器(SysTick),支持 HCLK 或者 HCLK/8 作为时基,…

VQ30 广告点击的高峰期(order by和limit的连用)

代码 select hour(click_time) as click_hour ,count(hour(click_time)) as click_cnt from user_ad_click_time group by click_hour order by click_cnt desc limit 1知识点 order by和limit的连用&#xff0c;取出所需结果 YEAR() 返回统计的年份 MONTH() 返回统计的月份 D…

【C++初阶】deque容器的介绍以及为什么stack和queue选择deque的作为底层容器适配器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

【C语言】实现栈

目录 &#xff08;一&#xff09;栈 &#xff08;二&#xff09;头文件 &#xff08;三&#xff09;功能实现 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09; 栈的销毁 &#xff08;3&#xff09;压栈 &#xff08;4&#xff09; 出栈 &#xff08;5&a…

软件实例分享,乒乓球俱乐部会员系统管理软件教程

软件实例分享&#xff0c;乒乓球俱乐部会员系统管理软件教程 一、前言 以下软件程序教程以 佳易王乒乓球馆计时计费软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 多种计费方式&#xff0c;可以按单价&#xff0c;也可以按时间段 可…

VR直播:只需五步,即可实现直播“黑科技”

现如今&#xff0c;VR直播的应用范围较为广泛&#xff0c;有很多人可能在现场见过VR直播的拍摄设备&#xff0c;不仅有高性能的电脑、VR相机&#xff0c;还有专业的灯光和拍摄机器等。只需要五步&#xff0c;就可以实现安全、高效的VR全景直播。 首先是专业全景采集设备进行全景…

用纯HTML写一个凭证并打印

最近有个需求&#xff0c;需要通过网页把单子打印出来&#xff0c;就用html实现了一个&#xff0c;主要使用了windwos自带的print打印&#xff0c;全部代码如下&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" cont…

Java21 + SpringBoot3使用Spring Security时如何在子线程中获取到认证信息

文章目录 前言原因分析解决方案方案1&#xff1a;手动设置线程中的认证信息方案2&#xff1a;使用DelegatingSecurityContextRunnable创建线程方案3&#xff1a;修改Spring Security安全策略通过设置JVM参数修改安全策略通过SecurityContextHolder修改安全策略 总结 前言 近日…

Mysql开启bin-log日志

目录 一、安装配置 二、mysqlbinlog命令 一、安装配置 yum -y install mariadb mariadb-server#安装mysql数据库#默认配置文件/etc/my.cnfvim /etc/my.cnflog-binmariadb-bin #开启二进制日志 systemctl restart mariadb#会在/car/lib/mysql/产生二进制日志文件&#xff0…

Java_方法(重载方法签名等详解)

在之前我们学习C语言时&#xff0c;当我们想要重复使用某段代码的功能时&#xff0c;我们会将这段代码定义为一个函数&#xff0c;而在java中我们把这段重复使用的代码叫做方法。 方法的定义 类体的内容分为变量的声明和方法的定义&#xff0c;方法的定义包括两部分&#xff1…

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[搭建篇]

全网最详细的从0到1的turbo pnpm monorepo的前端工程化项目[搭建篇] 引言相关环境技术栈初始化工程安装turbo配置pnpm-workspace安装husky安装lint-staged安装eslint安装prettier配置 .editorconfig配置 .gitignore初步项目结构结语 引言 最近各种原因&#xff0c;生活上的&am…

【C++初阶】值得一刷的字符串string相关oj题

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

二.重新回炉Spring Framework:Spring Framework主要组件概览

1.写在前面的话 这里主要简单说一下Spring Framework的几个核心组件的总体情况。为了比较直观&#xff0c;这里使用了ClassPathXmlApplicationContext的类图来进行说明。它基本上包含了 IoC 体系中大部分的核心类和接口。类图如下图所示&#xff1a; 2.Resource 组件体系 R…

项目管理软件品牌榜:行业领导者与热门选择

大数据、人工智能等新兴技术的崛起&#xff0c;各种行业在数字化转型的过程中&#xff0c;越来越注重有效的项目管理和协作方式。而各种项目管理软件应运而生&#xff0c;以帮助企业提高效率、降低成本、提高协作性。然而在众多的项目管理软件市场上&#xff0c;如何选择适合自…

PCIe TX端电容

一、问题&#xff1a;PCIe为什么要加电容 PCIe为什么要加电容&#xff1f;具体的作用是什么&#xff1f; 答&#xff1a;因为PCIe Host和Receiver两端的直流偏置会不一样&#xff0c;所以需要在PCIe的传输路径上加电容&#xff0c;这样传输路径上只有AC信号&#xff0c;不存在…