数字序列的最大间隔(harsh)

这篇博客探讨了一种解决寻找给定数字序列中最大间隔问题的算法。通过使用伪随机数生成函数rand32(),并采用分桶策略优化时间复杂度,避免了O(nlogn)的时间复杂度导致的超时问题。文章详细展示了算法的实现过程,包括分桶、遍历和更新最大间隔等步骤,并给出了示例输入输出以验证算法的正确性。
摘要由CSDN通过智能技术生成

/*题目描述

题目描述

请输出数字序列的最大间隔。

请使用以下伪随机数生成函数 rand32 () 生成伪随机数

int seed ;
int rand(){ return((( seed = seed * 214013L + 2531011L) >> 16) & 0x7fff); }
int rand32(){
return ((rand() << 16) + (rand() << 1) + rand() % 2);
}

Input Format

2个整数,n seed 其中 2<n<=20000000,seed为随机数种子。
Output Format

整数序列的最大间隔
Example
Input

2000000
1
Output

15737

注意:O(nlogn)以上的时间复杂度至少会有一个案例超时。

样例输入输出
样例1
输入:
1959000 4910
输出:
16709*/

#include
using namespace std;

int n,seed;
int randI() {
return(((seed = seed * 214013L + 2531011L) >> 16) & 0x7fff);
}
int rand32() {
return ((randI() << 16) + (randI() << 1) + randI() % 2);
}
int maxGap(int arr[]) {
int maxGap=0;
int minN = arr[0], maxN = arr[0];
//遍历找到数组中最大值最小值。
for (int i = 0; i < n; ++i)
{
if (arr[i] > maxN)maxN = arr[i];
if (arr[i] < minN)minN = arr[i];
}
if (maxN == minN)return 0;

bool *harsh=new bool[n]{0};
int*mins=new int[n];
int *maxs=new int[n];
double gap=double(maxN-minN)/(n-1);//im  double为了让分桶更加均匀!!!
for (int i = 0; i < n; i++)
{
	int indix=int((arr[i]-minN)/gap);//im   分桶均匀的情况下让下标成为整数
	if (harsh[indix])
	{
		mins[indix]=min(mins[indix],arr[i]);
		maxs[indix]=max(maxs[indix],arr[i]);
	}
	else
	{
		mins[indix]=maxs[indix]=arr[i];
		harsh[indix]=1;
	}
	
} 
int lastMax=maxs[0];
for (int i = 1; i < n; i++)
{
	
	if(harsh[i])
	{
		maxGap=max(maxGap,mins[i]-lastMax);
		lastMax=maxs[i];
	}
	
}
delete[]maxs;
delete[]mins;
delete []harsh;
return maxGap;

}
int main() {
cin >> n >> seed;
int* arr = new int[n];
for (int i = 0; i < n; ++i)
arr[i] = rand32();
cout << maxGap(arr) << endl;
delete[]arr;
//system(“pause”);
return 0;
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值