题解 - 最长平台

题目描述

给定一个整数数列 a1,a2,…,an,请找出最长平台。所谓平台,就是指数列中一段连续的、完全相等的数字,单
个数字也可以成为一个平台。最长平台可能不止一个,在找到最长平台的同时,输出最长平台的数量。
输入格式
第一行:单个整数 n
第二行:n 个整数 a1,a2,…,an
输出格式
两个整数:表示最长平台的长度与最长平台的数量
数据范围
。对于 50% 的数据,n< 1000
。对于 100% 的数据,n< 500,000
。 1<ai< 1,000,000
输入:
7
2 2 2 1 3 3 3
输出:
3 2
说明:
最长平台为2 2 2或3 3 3
输入:
5
3 1 4 1 5
输出:
1 5
说明:
每个数字单独成一个平台

分析

知识点:模拟

解题思路:

维护 l a s , d q , c n t , m x las,dq,cnt,mx las,dq,cnt,mx 分别表示上一个数是多少,目前平台的长度,最长平台的个数和长度。

对于一个数,如果和 las 不同,则考虑 las 所在段是否能成为答案,如果比 mx 大则更新 mx 并把 cnt 置 0,然后如果有长度和 mx 相等则 cnt++

然后把当前平台的长度+1

复杂度 O ( n ) O(n) O(n)

代码

#include<bits/stdc++.h>
using namespace std;
int const N=1e6+10;
int n,a[N];

int main(){
	cin>>n;
	int las=0,dq=0,cnt=0,mx=-1;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		if(a[i]!=las){
			if(dq>mx){
				mx=dq; cnt=0;
			}
			if(dq==mx) cnt++;
			dq=0; 
		}
		las=a[i]; dq++;
		//cout<<cnt<<endl;
	} 
	if(dq>mx) cnt=0,mx=dq;
	if(dq==mx) cnt++;
	cout<<mx<<' '<<cnt<<endl;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值