数据结构-双指针法

介绍 

双指针法是一种可以在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;
}

 

 

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

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

相关文章

阿里云服务器配置怎么选?CPU内存带宽配置多大?

阿里云服务器配置怎么选择&#xff1f;根据实际使用场景选择&#xff0c;个人搭建网站可选2核2G配置&#xff0c;访问量大的话可以选择2核4G配置&#xff0c;企业部署Java、Python等开发环境可以选择2核8G配置&#xff0c;企业数据库、Web应用或APP可以选择4核8G配置或4核16G配…

入门OpenCV:图像阈值处理

基本概念 图像阈值是一种简单、高效的图像分割方法&#xff0c;目的是将图像转换成二值图像。这个过程涉及比较像素值和阈值&#xff0c;根据比较结果来确定每个像素点的状态&#xff08;前景或背景&#xff09;。图像阈值在处理二维码、文本识别、物体跟踪等领域中非常有用。…

【前端工程化面试题】webpack proxy的工作原理,为什么能解决跨域问题

在 webpack 的配置文件 webpack.config.js 中有一个配置项 devServer 里面有一个属性是 proxy&#xff0c;这里面可以配置代理服务器&#xff0c;解决跨域问题&#xff0c;请参考官网。 一般来说 webpack 的代理就是说的开发服务器 webpack-dev-server。 其实不光是 webpack 其…

“挖矿”系列:细说Python、conda 和 pip 之间的关系

继续挖矿&#xff0c;挖“金矿”&#xff01; 1. Python、conda 和 pip&#xff08;挖“金矿”工具&#xff09; Python、conda 和 pip 是在现代数据科学和软件开发中常用的工具&#xff0c;它们各自有不同的作用&#xff0c;但相互之间存在密切的关系&#xff1a; Python&…

AIGC实战——能量模型(Energy-Based Model)

AIGC实战——能量模型 0. 前言1. 能量模型1.1 模型原理1.2 MNIST 数据集1.3 能量函数 2. 使用 Langevin 动力学进行采样2.1 随机梯度 Langevin 动力学2.2 实现 Langevin 采样函数 3. 利用对比散度训练小结系列链接 0. 前言 能量模型 (Energy-based Model, EBM) 是一类常见的生…

《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术(6)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第13章 PCI总线与虚拟化技术&#xff08;5&#xff09; 13.2 ATS&#xff08;Address Translation Services&#xff09; 单纯使用IOMMU并不能充分发挥处理器系统的效率&#xff0c;从图13-2中可以发现&…

JVM-JVM中对象的生命周期

申明&#xff1a;文章内容是本人学习极客时间课程所写&#xff0c;文字和图片基本来源于课程资料&#xff0c;在某些地方会插入一点自己的理解&#xff0c;未用于商业用途&#xff0c;侵删。 原资料地址&#xff1a;课程资料 对象的创建 常量池检查:检查new指令是否能在常量池…

亚马逊测评:揭秘做号的“花招”与“猫腻”,如何避免被割韭菜?

亚马逊测评行业如今如火如荼&#xff0c;吸引了众多朋友投身其中。然而&#xff0c;这个行业也是五花八门&#xff0c;什么样的人和公司都有&#xff0c;让人眼花缭乱。作为卖家&#xff0c;如何选择靠谱的测评服务商是一门必修课&#xff1b;而对于初学者&#xff0c;如何入门…

TensorRT转换onnx的Transpose算子遇到的奇怪问题

近来把一个模型导出为onnx并用onnx simplifier化简后转换为TensorRT engine遇到非常奇怪的问题&#xff0c;在我们的网络中有多个检测头时&#xff0c;转换出来的engine的推理效果是正常的&#xff0c;当网络中只有一个检测头时&#xff0c;转换出来的engine的推理效果奇差&…

PAM | 账户安全 | 管理

PAM PAM&#xff08;Pluggable Authentication Modules&#xff0c;可插入式身份验证模块&#xff09;是一个灵活的身份验证系统&#xff0c;允许我们通过配置和组合各种模块来实现不同的身份验证策略。 在 Linux 或类 Unix 系统中&#xff0c;常见的 PAM 模块包括以下几种类…

时序预测 | Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间序列预测

时序预测 | Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间序列预测 目录 时序预测 | Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 Matlab实现BO-LSSVM贝叶斯算法优化最小二乘支持向量机时间…

Open CASCADE学习|直纹曲面(ruled surface)

直纹曲面是一类特殊的曲面&#xff0c;在几何学和微分几何中都有研究。它的主要特性是&#xff0c;曲面上的每一点都有至少一条直线经过。换句话说&#xff0c;直纹曲面可以由一条直线通过连续运动构成。在三维欧几里德空间中&#xff0c;最常见的直纹曲面是平面、柱面和锥面&a…

JAVA面试框架篇

1. Spring refresh 流程 要求 掌握 refresh 的 12 个步骤 Spring refresh 概述 refresh 是 AbstractApplicationContext 中的一个方法&#xff0c;负责初始化 ApplicationContext 容器&#xff0c;容器必须调用 refresh 才能正常工作。它的内部主要会调用 12 个方法&#x…

Manifest merger failed with multiple errors, see logs

问题 Manifest merger failed with multiple errors, see logs详细问题 笔者进行Android 项目开发&#xff0c;修改AndroidManifest.xml代码后&#xff0c;控制台报错 AndroidManifest.xml报错核心代码 <manifest><uses-permission android:name"android.perm…

解码DMAIC:李国武老师的品质与运营之道

DMAIC&#xff0c;对于许多人来说可能还是一个相对陌生的概念。但如果你是企业界的观察者&#xff0c;或者对提升产品质量有着浓厚的兴趣&#xff0c;那么你一定不能错过这个话题。DMAIC不仅是一种方法论&#xff0c;更是企业实现卓越运营、提升竞争力的关键工具。今天&#xf…

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

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

166基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪

基于matlab的通过峭度指标与互相关系数筛选IMF进行SVD分解去噪&#xff0c;分辨虚假imf&#xff0c;提取最大峭度imf图。输出去噪前后时域及其包络谱结果。程序已调通&#xff0c;可直接运行。 166 matlab SVD去噪 IMF筛选 包络谱 (xiaohongshu.com)

2.14日学习打卡----初学Zookeeper(一)

2.14日学习打卡 目录: 2.14日学习打卡Zookeeper概念一. 集中式到分布式单机架构集群架构什么是分布式三者区别 二. CAP定理分区容错性一致性可用性一致性和可用性的矛盾一致性和可用性如何选择 三. 什么是Zookeeper分布式架构Zookeeper从何而来Zookeeper介绍 四. 应用场景数据发…

【python--迭代生成器闭包面向对象继承多态】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;深度学习 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; python--迭代生成器闭包面向对象继承多态 往期内容1.迭代for...in字典的迭代列表迭代 生成器推导式的…

说说对BOM的理解(常见的BOM对象了解哪些)

文章目录 一、是什么二、window三、location四、navigator五、screen六、history 一、是什么 BOM (Browser Object Model)&#xff0c;浏览器对象模型&#xff0c;提供了独立于内容与浏览器窗口进行交互的对象 其作用就是跟浏览器做一些交互效果,比如如何进行页面的后退&…