线性时间求解 最大间隙问题

给定乱序实数,求相邻数最大差值。采用鸽舍原理,找到最大值和最小值,将数轴分为n+1区间,至少有一个区间为空,其前区间最大值与后区间最小值即为最大间隙。线性时间复杂度算法通过避免排序实现高效求解。
摘要由CSDN通过智能技术生成

问题描述:给定n个乱序的实数,求这些数在实数轴上相邻2个数之间的最大差值,假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。

思路:如果采用先排序,再求解最大间隙的方式,即使是采用堆排序,解处该问题的复杂度也在O(nlogn)。要在线性时间内求解,可以采用“鸽舍原理”,我们首先找到这组数的最大和最小值,将两个数之间的数轴分为n+1份,将这n个数依次放到这n+1个区间中,由“鸽舍原理”可知,其中必有一个区间没有数,则最大间距应是该区间的前一个区间中最大数与该区间后一个区间中最小数之间的差值。

代码:

float max_num(float num_arr[], int n) { #找出该组数中最大值。
	float temp = num_arr[0];
	for (int i = 1;i < n;i++) {
		if (temp < num_arr[i]) temp = num_arr[i];
	}
	return temp;
}
float min_num(float num_arr[], int n) {#找出该组数中最小值。
	float temp = num_arr[0];
	for (int i = 1;i < n;i++) {
		if (temp > num_arr[i]) temp = num_arr[i];
	}
	return temp;
}
float max_gap(float num_arr[], int n) {  #求解最大间隙
	float *high = new float[n + 1];   #用于记录每个区间最大值。n个数,总共n+1个区间。
	float *low = new float
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值