数据结构-双指针法

介绍 

双指针法是一种可以在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.hqwc.cn/news/474834.html

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

相关文章

OpenAI发布Sora模型,可根据文字生成逼真AI视频

早在2022年11月30日&#xff0c;OpenAI第一次发布人工智能聊天机器人ChatGPT&#xff0c;随后在全世界掀起了人工智能狂潮&#xff0c;颠覆了一个又一个行业。在过去的一年多的时间里&#xff0c;chatGPT的强大功能改变了越来越多人的工作和生活方式&#xff0c;成为了世界上用…

Shell sorting

希尔排序可以看作是对插入排序的优化。其时间复杂度为O()&#xff0c;或者更小。准确的平均时间复杂度很难得到。 在Robert<算法>里提到间隔序列为1&#xff0c;4&#xff0c;13... 更优。 #include<bits/stdc.h> using namespace std;const int N 1e5 10; int…

解读OpenAI视频生成模型Sora背后的原理:Diffusion Transformer

Diffusion Models视频生成-博客汇总 前言&#xff1a;OpenAI最近推出的视频生成模型Sora在效果上实现了真正的遥遥领先&#xff0c;很多博主都介绍过Sora&#xff0c;但是深入解读背后原理的博客却非常少。Sora的原理最主要的是核心模型主干《Scalable Diffusion Models with T…

Flash Extractor芯片的读取教程

Flash Extractor芯片的读取教程 2024-01-29 20:04:08 jsos 64 目录 Flash Extractor芯片的读取教程 1:芯片的拆卸 使用热风枪对准TSOP-48芯片引脚封装边缘,温度设置370.拆焊后, 使用酒精清洁焊料中的残余, 将金手指上焊锡清理干净,可以使用刀片刮拭 ,使引脚光滑并整形. …

从零开始学习数据结构—【链表】—【探索环形链的设计之美】

环形链表 文章目录 环形链表1.结构图2.具体实现2.1.环形链表结构2.2.头部添加数据2.2.1.具体实现2.2.2.测试添加数据 2.3.尾部添加数据2.3.1.具体实现2.3.2.添加测试数据 2.4.删除头部数据2.4.1.具体实现2.4.2.测试删除数据 2.5.删除尾部数据2.5.1.具体实现2.5.2.测试删除数据 …

java面试集合篇

上面是java中集合的整体框架图。 集合使用的数据结构 算法复杂度分析 时间复杂度分析 时间复杂度分析&#xff1a;来评估代码的执行耗时的 /*** 求1~n的累加和* param n* return*/ public int sum(int n) {int sum 0;for ( int i 1; i < n; i) {sum sum i;}return …

SG7050EAN规格书

SG7050EAN 晶振是EPSON/爱普生的一款额定频率73.5 MHz ~ 700mhz的石英晶体振荡器&#xff0c;7050封装常规有源晶振&#xff0c;4脚贴片&#xff0c;具有小尺寸&#xff0c;高稳定性。SG5032EAN 晶体振荡器结合了相位锁定环&#xff08;PLL&#xff09;技术和AT切割晶体单元&am…

【Java多线程】线程中几个常见的属性以及状态

目录 Thread的几个常见属性 1、Id 2、Name名称 3、State状态 4、Priority优先级 5、Daemon后台线程 6、Alive存活 Thread的几个常见属性 1、Id ID 是线程的唯一标识&#xff0c;由系统自动分配&#xff0c;不同线程不会重复。 2、Name名称 用户定义的名称。该名称在各种…

高校实验室危险化学品如何管理?看了这篇文章让您管理危化品不在难!

采用‘一人一格’负责制&#xff0c;实现网格化、精准化、精细化安全管理可快速、全面、准确地掌控实验室危化品使用信息及危废管理&#xff0c;系统功能涵盖危化品的计划申购、采购入库、领用、退还、统计、查询管理等模块。采用“五双”原则&#xff0c;实现学校对实验室危化…

30种EMC标准电路

01 AC24V接口EMC设计标准电路 02 AC110V-220V EMC设计标准电路 03 AC380V接口EMC设计标准电路 04 AV接口EMC设计标准电路 05 CAN接口EMC设计标准电路 06 DC12V接口EMC设计标准电路 07 DC24V接口EMC设计标准电路 08 DC48接口EMC设计标准电路 09 DC110V接口EMC设计标准电路 010 D…

CSS 圆形的时钟秒针状的手柄绕中心点旋转的效果

<template><!-- 创建一个装载自定义加载动画的容器 --><view class="cloader"><!-- 定义加载动画主体部分 --><view class="clface"><!-- 定义类似秒针形状的小圆盘 --><view class="clsface"><!-…

智能扭矩系统——SunTorque

随着工业自动化的不断发展&#xff0c;智能扭矩系统作为一种新型的扭矩控制技术&#xff0c;逐渐受到广泛关注。智能扭矩系统是一种基于传感器技术和计算机控制的扭矩管理系统&#xff0c;它能够实时监测和调整设备的扭矩输出&#xff0c;以确保生产过程中的稳定性和安全性。 搭…