顺子区间-腾讯2023笔试(codefun2000)
创始人
2024-11-17 17:36:57
0

题目链接
顺子区间-腾讯2023笔试(codefun2000)

题目内容

塔子哥最近喜欢研究顺子,顺子的定义为:排序后相邻两元素的差的绝对值恰好等于 1。
现在有人给塔子哥一个长度为 n 的数组,他问塔子哥有多少长度为 k 的子区间满足:子区间中元素恰好构成一个顺子?但是塔子哥最近没有时间帮他解决这个问题,你能帮帮他吗?
例如,对于数组 [3,7,6,4,5], 子数组 [4,5] 是一个顺子,子数组[7,6]也是一个顺子。
备注:
子区间可以理解为从原数组中从头部或尾部选择一些元素删掉(或者不删)并保持剩余元素的相对位置不变。

输入描述

第一行两个整数 n 和k ,1≤k≤n≤300000
第二行 n 个整数, a1 ,a2 ,…an,( 1 ≤ a i ≤ 1 0 6 ) 1≤ai≤10^6) 1≤ai≤106)

输出描述

输出一个正整数代表答案。

样例1

输入

4 2
1 2 3 4

输出

3

样例1解释

满足条件的区间有 [1,2] 和 [2,3] 还有 [3,4] 。

样例2

输入

6 3
1 3 5 4 6 2

输出

2

样例2解释

满足条件的区间有 [3,5,4] 和 [5,4,6]。

提示

一个商品折扣价购入,第二个商品原价购入,可以获得最多的商品数量

题解1(C++版本)

#include using namespace std;  const int N = 3e5 + 10; const int M = 1e6 + 10; int n, k, ans, mx[N], mi[N], a[N], q[N], hmap[M];  void getMax(){ // 维护单调队列的队头保存最大值  	int h = 1, t = 0; 	for(int i = 1; i <= n; i++){ 		while(h <= t && a[q[t]] <= a[i]) t--; // 队尾出队 		q[++t] = i; 		if(i - q[h]+1 > k) h++; 		if(i >= k) mx[i] = a[q[h]]; // 记录最值  	} }  void getMin(){ // 维护单调队列的队头保存最小值  	memset(q, 0, sizeof q); 	int h = 1, t = 0; 	for(int i = 1; i <= n; i++){ 		while(h <= t && a[q[t]] >= a[i]) t--; // 队尾出队 		q[++t] = i; 		if(i - q[h]+1 > k) h++; 		if(i >= k) mi[i] = a[q[h]]; // 记录最值  	} } int main(){ 	memset(mx, 0, sizeof mx); 	memset(mi, 0, sizeof mi); 	memset(hmap, 0, sizeof hmap); 	 	scanf("%d%d", &n, &k); 	for(int i = 1; i <= n; i++) scanf("%d", &a[i]); 	getMax(); getMin(); 	int cnt = 0; 	for(int i = 1; i <= n; i++) { 		hmap[a[i]]++; // hmap[i[:表示i在子区间[i-k+1,i]中出现的次数  		if(hmap[a[i]] == 1) cnt++; // 统计子区间[i-k+1,i]中只出现一次的元素的个数 		if(i < k) continue; // 前k-1个元素,长度 // 子区间[i-k+1,i]内的最大值-最小值+1=k,并且子区间[i-k+1,i]内没有重复的数,则该子区间中元素恰好构成一个顺子  			 ans++; 		} 		hmap[a[i - k + 1]]--; // 区间左端点的值出现的次数-1  		if(hmap[a[i - k + 1]] == 0) cnt--; 	} 	printf("%d\n", ans); 	return 0; } 

相关内容

热门资讯

秒懂教程!微信牛牛房卡在哪里买... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...
秒懂教程!微信玩炸金花房卡链接... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程!拼三张房卡从哪买的,... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
秒懂教程!正版玩牛牛购买房卡,... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...
秒懂教程!微信创建炸金花好友房... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程!拼三张好友房卡在哪里... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
秒懂教程!微信牛牛房间怎么弄,... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...
秒懂教程!拼三张房卡如何购买,... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程!炸金花好友房卡在哪里... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
安卓开发关闭系统进程,掌握关闭... 你有没有想过,你的安卓手机里那些默默无闻的系统进程,其实也在悄悄地影响着你的手机性能呢?今天,就让我...
秒懂教程!微信炸金花购买房卡方... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
秒懂教程!微信里面拼三张链接房... 拼三张是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
平板电脑恢复安卓系统,一步到位... 亲爱的读者们,你是否曾经遇到过平板电脑卡顿、运行缓慢的问题?别急,今天就来给你支个招——平板电脑恢复...
秒懂教程!微信群炸金花房间怎么... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享...
秒懂教程!微信斗牛怎么买房卡,... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享受...
秒懂教程!如何创建炸金花房间,... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程!微信牛牛房卡如何购买... 牛牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...
秒懂教程!微信群链接炸金花房卡... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:56001354许多玩家在游戏中会购买房卡来享...
秒懂教程!微信炸金花房卡如何购... 炸金花是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:71319951许多玩家在游戏中会购买房卡来享...
秒懂教程!微信里面斗牛链接房卡... 斗牛是一款非常受欢迎的棋牌游戏,咨询房/卡添加微信:66336574许多玩家在游戏中会购买房卡来享受...