蓝桥杯备赛 Day7 双指针

双指针

1.要点

(1)常用于数组或字符串,用两个变量来表示下标实现

(2)对撞指针:

left=1,right=n反向,直到left>right

查询有序 数组中满足约束条件的一组元素问题,如二分查找、数字之和等

字符串反转问题:反转字符串、回文数、颠倒二进制等

(3)快慢指针(区间问题 ):

left=1,right=0,初始区间l,0为非法区间.两个指针从同侧开始,以不同策略、不同速度移动,形成l,r合法区间,直到right>n或者left>right

复制代码
for(int l=0,r=0;r<n;r++){
	while(){//区间太大了,缩小左边界
		l++;
		//l改变产生什么影响
	}
	if(l<=r){
		//r改变产生什么影响
	}
}

2.例题

2018日志统计

学习 :

(1)学会用pair<int,int>,不要老想着用map<int,int>,map的键是唯一的

(2)想明白开几个数组,每个数组什么含义
代码:

复制代码
#include <bits/stdc++.h>

using namespace std;

typedef pair<int,int> PII;
const int N=1e5+10;
PII logs[N];//日志编号,时刻-id
bool res[N];//id是否是热帖
int cnt[N];//id获赞次数 

int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n,D,K;
	cin>>n>>D>>K;
	for(int i=0;i<n;i++){
		cin>>logs[i].first>>logs[i].second;
	}
	sort(logs,logs+n);//按日志的时刻排序
	for(int l=0,r=0;r<n;r++){ //快慢指针 
		int id=logs[r].second; //新日志的id 
		cnt[id]++;
		while(logs[r].first-logs[l].first+1>D){//区间长度大于D,左指针向右移动,对应的id点赞次数减一 
			cnt[logs[l].second]--;
			l++; 
		}
		if(cnt[id]>=K)	res[id]=true;
	} 
	for(int i=0;i<N;i++){
		if(res[i]){
			cout<<i<<"\n";
		}
	}
	return 0;
}
2022统计子矩阵

学习 :

(1)二维前缀和√

(2)遍历二维矩阵时注意x2,y2从x1,y1开始,不重复

(3)双指针一般只考虑一维,所以遍历行,列为快慢指针,然后for中r++,而for里面条件判断l++,再看快慢指针动完后所求数变了多少

复制代码
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N=510;
int a[N][N],prefix[N][N];

int main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	int n,m;
	ll k;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			prefix[i][j]=a[i][j]+prefix[i-1][j]+prefix[i][j-1]-prefix[i-1][j-1];
		}
	}
	ll res=0;
	//i,i遍历上下边界,l,r为快慢指针,这样不会重复 
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			for(int l=1,r=1;r<=m;r++){
				while(l<=r && prefix[j][r]-prefix[j][l-1]-prefix[i-1][r]+prefix[i-1][l-1]>k)	l++;
				if(l<=r)	res+=r-l+1;//新增的子矩阵个数,比如l为1,r变为3, 多了 123,23,3三个子矩阵(不用管行)
			}
		}
	}
	cout<<res;
	return 0;
}
相关推荐
程序喵大人1 小时前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象
致Great6 小时前
DeepSeek Harness插件开发实战教程:我让它自己写了一个 arXiv 搜索插件
算法
ShineWinsu7 小时前
对于C++:auto_ptr、unique_ptr、shared_ptr的模拟实现
c++·面试·笔试·智能指针·unique_ptr·shared_ptr·auto_ptr
XLYcmy9 小时前
京东 算法实习一面 下+手撕
c++·python·llm·概率论·数据处理·训练·codebert
反转180度10 小时前
Qt 6 + C++17 实现 SFTP 批量部署:工业设备运维工具实战解析
运维·c++·qt
罗西的思考10 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
民乐团扒谱机11 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
码匠许师傅11 小时前
【C++ 面试真题】聊聊 C++ 的多继承与虚继承
开发语言·c++·面试
Nil20811 小时前
leetcode 160相交链表
算法·leetcode·链表
迷途之人不知返12 小时前
算法系列2:滑动窗口
算法