理解最大间隙问题算法

经典算法(3)——最大间隙问题(线性时间算法) 本博客(http://blog.youkuaiyun.com/livelylittlefish)贴出作者(三二一、小鱼)相关研究、学习内容所做的笔记,欢迎广大朋友指正!                                                               最大间隙问题                                            阅读详情
题目描述

给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法(时间复杂度为O(n))。

输入

数组

输出

最大间隙

样例输入
1,2,4,3,5,8.5,7,8,10,19
样例输出
9

解题思路:

首先了解一下鸽笼原理(抽屉原理):把n个物品放到n-1个抽屉里,不管怎么分,则至少有一个桶空着!这个思想有用到。
回到这道题,如何理解解题算法:
我们假定有N = 10的数组array【1,2,4,3,5,8.5,7,8,10,19】这10个数字,欲找到里面最大相邻间隙。

1.分区间:

该算法的意思是先找到最大值 MAX 和最小值 MIN,然后用 ( MAX - MIN ) ÷ ( N-1 ) ;求得一个区间长度 len=2,这波操作相当于我们以 len 为梯度分了10个区间;也就是常说的分了10个桶。

在这里插入图片描述
2.放数字:

下一步我们需要将【1,2,4,3,5,8.5,7,8,10,19】这10个数字放到这10个区间里。用一个公式来放:
(int)( (array[i]-MIN) / len)
这个公式会把每个数按大小公平地划分到对应的梯队里面 !

例如:

  • 数字 1 : (1 - 1)/ 2 = 0 ,所以数字1放在了0号区间里,

  • 数字 2 : (2 - 1)/ 2 = 0 ,所以数字2放在了0号区间里,

  • 数字 4 : (4 - 1)/ 2 = 1 ,所以数字3放在了1号区间里,
    …

  • 数字 10 : (10 - 1)/ 2 = 4,所以数字10放在了4号区间里,

  • 数字 19 : (19 - 1)/ 2 = 9 ,这里所以数字19放在了9号区间里;

如下:

在这里插入图片描述

下一步我们把每个区间只留下最大值和最小值。
用一个规则,没有数字的区间不管,只有一个数字那么最大值和最小值都是它,有两个数以上就只留下最大值最小值。换成编程语言意思就是只记录最大值最小值。
如下:

在这里插入图片描述
4.求最大间隙:

现在就可以求最大间隙了,它存在于某一个区间地最大值与下一个区间最小值差值里面!也就是说某区间最大值和下一个区间最小值的差值集的最大值就是原来数组的最大间隙~
怎么理解:因为每个区间里的数字都你是按大小分的,那么同一个区间内的最大值最小值差值必然不会超过区间len!如果超过了len,那么这个区间里面的最大数早就按公式被分到下一个区间里去了,或者最小值早就被分到上一个梯度的区间了,所以能跳出len的长度的间隙一定只存在于两个区间之间。

LeetCode 代码:

	int maximumGap(vector<int> &nums) {
        int N = nums.size();
        if(N < 2){
        	return 0;
		}
        int count[N] = {0},i;
        double max[N];
        double min[N];
        /*找出梯队长度*/
    	// (MAX - MIN ) / (N-1)
    	double MAX = nums[0], MIN = nums[0];
    	for(i = 1 ; i < N ; i++) {
    		if ( nums[i] > MAX ) {
    			MAX = nums[i];
    		}
    		if( nums[i] < MIN) {
    			MIN = nums[i];
    		}
    	} 
    	if(MAX - MIN == 0){
    		return 0;
		}
    	double len = (MAX - MIN ) / (N-1) ;
    	/*对桶进行初始化*/ 
    	//每个桶的最大值初始化了一个最小数
    	//每个桶的最大值初始化了一个最小数
    	//这样是为了保证至少能够被array中的最大或最小数替换掉 
    	//虽然定义了N个桶,但必然至少有一个桶是不会被用的 
    	for(i=0;i<N;i++){
    		max[i]=MIN;
    		min[i]=MAX;
    		count[i]=0;
    	}
    	
    	/*把n个数放到n-1个桶中,必然至少一个桶没放数,至少一个,因为我定义了n个桶*,而又是按n-1划分的*/
    	//每个数如何找到正确的桶下标index?公式:int index = (int)( (nums[i]-min) / len)
    	int index; 
    	for(i=0;i<N;i++){
    		index=(int)( (nums[i]-MIN) / len);
    		if(max[index] < nums[i])
    			max[index]=nums[i];	
    		if(min[index] > nums[i])
    			min[index]=nums[i];
    		count[index]++;
    	} 
    	
    		/*计算最大间隙*/
    	//去掉空桶 生成一个新数组 
    	int x,y;
    	double Gap = len,last,now;
    	for(i=0;i<N-1;){
    		x = i;
    		last = max[x];
    		if( count[i+1] == 0 ){
    			while(count[++i] == 0);
    			y=i;
    		}else{
    			y = i+1;
    		}
    		now = min[y];
    		if(now - last > Gap){
    			Gap = now - last;
    		}
    		i = y;
    	}
    	return Gap;
    }

写全一点:

#include <stdio.h>
#define N 5
//待排序数组  
double array[N] = {2.1,3.1,1.5,0.3,7.5};
int main(){
	//只有一个数没有间隙 
	if(N < 2){
		return 0
	} 
	/*对桶进行初始化*/ 
	//每个桶的最大值初始化了一个最小数
	//每个桶的最大值初始化了一个最小数
	//这样是为了保证至少能够被array中的最大或最小数替换掉 
	//虽然定义了N个桶,但必然至少有一个桶是不会被用的 
	//记录每个桶每个桶被分到的数字
	int count[N] = {0};
	//记录每个桶中最大值
	double max[N];
	//记录每个分桶中最小值
	double min[N];
	int i;
	for(i=0;i<N;i++){
		max[i]=smallest;
		min[i]=biggest;
		count[i]=0;
	}
	/*找出梯队长度*/
	// (MAX - MIN ) / (N-1)
	double MAX = array[0], MIN = array[0];
	for(i = 1 ; i < N ; i++) {
		if (array[i] > MAX ) {
			MAX = array[i];
		}
		if(array[i] < MIN) {
			MIN = array[i];
		}
	} 
	// 数字全都一样的情况 
	if(MAX - MIN == 0){
    	return 0;
	}
	double len = (MAX - MIN ) / (N-1) ;
	
	/*把n个数放到n-1个桶中,必然至少一个桶没放数,至少一个,因为我定义了n个桶*,而又是按n-1划分的*/
	int index; 
	for(i=0;i<N;i++){
		index=(int)( (array[i]-MIN) / len);
		if(max[index] < array[i])
			max[index]=array[i];	
		if(min[index] > array[i])
			min[index]=array[i];
		count[index]++;
	} 
	/*计算最大间隙*/
	int x,y;
	double Gap = len,last,now;
	for(i=0;i<N-1;){
		x = i;
		last = max[x];
		if( count[i+1] == 0 ){
			while(count[++i] == 0);
			y=i;
		}else{
			y = i+1;
		}
		now = min[y];
		if(now - last > Gap){
			Gap = now - last;
		}
		i = y;
	}
	printf("%lf",Gap);
	return 0;
} 
代码的时间复杂度为O(n)。
最大间隙问题最大间隙问题:给定n 个实数x1, x2,... , xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。 最大间隙问题 最大间隙问题:给定n 个实数x1, x2,... , xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。 编程任务:对于给定的n 个实数x1, x2,...,xn,编程计算它们的最大间隙。 Input 输入数据的第1 行有1 个正整数n。接下来的1 行中有n个实数x1, x2,... , xn。 Output 程序运行结束时,将找到的最大间隙输出。 Sample Input 5 2.3 3.1 7.5 1.5 6.3 Sample Output 3.2 立即下载

相关推荐

相邻两点之间的最大间隙问题

解决相邻两点之间的最大间隙问题

最大间隙问题

最大间隙问题 Description 最大间隙问题:给定n个实数x1,x2,……,xn,求这n 个数在实轴上相邻2 个数之间的最大差值。 假设对任何实数的下取整方法耗时O(1),设计解最大间隙问题的线性时间算法。 对于给定的n 个实数x1,x2,……,xn,计算它们的最大间隙。 Input 输入数据的第1行有1个正整数n,n≤200000。 接下来的1行中有n个实数x1,x2,……,xn。 Out...

weixin_43736492的博客 2788

最大间隙问题 C++代码

最大间隙问题 C++代码

最大间隙问题-鸽舍原理

最大间隙问题 问题描述: 给定n个实数x1,x2,……,xn,求这n个数在实轴上相邻两个数之间的最大差值。假设对任何实数的下取整函数耗时O(1),设计解最大间隙问题的线性时间算法。 算法输入: 5 2.3 3.1 7.5 1.5 6.3 算法输出: 3.2 要想解决这个问题,最直观的解决方法就是将n个实数排序之后,线性寻找两两之间间隔的最大值。然而排序算法最好的复杂度是O(...

renwu 6285

自相关互相关卷积的_相关性(Correlation)和相干性(Coherence)

1. 概念相关性(Correlation,或称相关系数或关联系数),显示两相关变量之间线性关系的强度和方向。在统计学中,相关的意义是用来衡量两个变量相对于其相互独立的距离。相干性(Coherence),与相关性计算得到的信息非常相似,都是衡量两个变量之间的相关程度,只是相干性多用于频域计算,可以在基于频率上给出更多的信息,而相关性多用于普通的数组计算和时域信号。这里其实应该有三个概念,c...

weixin_39963053的博客 3332

四旋翼黑科技揭秘:如何利用PX4隐藏的角加速度数据提升控制性能

本文深入探讨了如何利用PX4飞控中隐藏的角加速度数据,结合增量非线性动态逆(INDI)控制方法,显著提升四旋翼无人机的控制性能。通过实战教程,指导开发者从数据订阅、INDI原理到代码实现,构建响应更快、鲁棒性更强的控制回路,有效应对突风与快速机动。

lake5的博客 719

【算法课】最大间隙问题

题目描述 给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法(时间复杂度为O(n))。 输入 第一行一个正整数n(2<=n<=2×1e7)第二行n个实数,数据保证这些实数只有一位小数。 输出 一个实数,保留1位小数。 样例输入 5 2.3 3.1 7.5 1.5 6.3 ...

weixin_30609287的博客 755

Flotherm XT学习历程

大家好,通过半年的热仿真软件学习使用,最终发现最好用,最好上手的软件就是Flotherm XT,对新手非常友好,但由于软件近几年才发布,网上教程非常少,后面我将在这里持续分析软件使用心得,和大家一起学习。

xiaoredred的博客 6258

最大间隙问题(线性时间)

问题描述: 最大间隙问题:给定n 个实数x1, x2 ,..., xn,求这n 个数在实轴上相邻2 个数之间的最大差值。假设对任何实数的下取整函数耗O(1),设计解最大间隙问题的线性时间算法。 编程任务: 对于给定的n 个实数x1,x2,...,xn,编程计算它们的最大间隙。 数据输入: 输入数据由文件名为input.txt的文本文件提供。文件的第1 行有1 个正整数n。接下来的

KeepTing 5252

手把手教你用DLP4500和海康相机搭建双目结构光系统(附完整代码获取路径)

本文详细介绍了如何利用DLP4500投影仪和海康工业相机搭建低成本双目结构光三维测量系统。从硬件选型、软件配置到结构光编码解码实现,再到三维重建全流程,提供了完整的实战指南和优化技巧,帮助用户以不到2万元的预算实现0.05mm精度的三维扫描。

weixin_32447969的博客 316

基于E310的纯逻辑代码实现AD9361射频收发

基于微相科技的E310平台实现AD9361的射频收发功能。采用纯逻辑控制的方式,不需要PS参与。实现了用VIO控制收发使能,发射功率,收发频率,数据接口时序控制,接收增益,BIST测试等功能。

xiaomingzi55的博客 2331

最大间隔问题

最大间隙问题。 给定 n 个实数,求这n个实数在数轴上相邻2个数之间的最大差值,设计解最大间隙问题的线性时间算法。 网上有很多代码,但没有图解,自己画了几张图帮助理解。 代码: #include &amp;amp;amp;lt;stdio.h&amp;amp;amp;gt; #define INF 1&amp;amp;amp;lt;&amp;amp;amp;lt;30 struct node{ double left,right; do

提拉米苏的博客 577

手把手教你用运放和基准源,把±10V信号变成ADC能吃的0-4V(附完整计算过程)

本文详细介绍了如何利用OP07运放和REF5040基准源设计工业级信号调理电路,将±10V传感器信号转换为0-4V ADC可接受范围。通过七步流程,包括需求分析、元器件选型、电路设计、理论计算、PCB布局、实测验证与性能优化,帮助工程师解决信号不匹配问题,提升系统精度与稳定性。

weixin_28731223的博客 467

最大流模板

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define MAXN 444 //邻接表要开边数的2倍 struct Edge{ int v,cap,next; }edge[MAXN...

dianning8393的博客 62

代谢组数据分析(二十六):LC-MS/MS代谢组学和脂质组学数据的分析流程

本教程概述了LC-MS/MS在代谢组学和脂质组学数据分析中的应用流程。首先介绍了样本的采集、提取和LC-MS/MS分析,随后详细阐述了质谱数据的预处理、峰值识别、特征注释,以及数据标准化和统计分析的重要性。特别强调了使用XCMS和CAMERA进行数据对齐和加合物识别,以及利用MultiABLER和LipidFinder进行数据过滤、插补和标准化处理。此外,还介绍了如何应用EigenMS算法进行数据标准化,以及如何使用Limma包进行差异分析。整个流程旨在提高数据质量,确保分析结果的准确性和可靠性,为后续的生

专注生信领域 1954

conda upgrade出现Solving environment:failed CondaValueError Malformed version string invalid chars解决方案

本文主要介绍了conda install出现Solving environment:failed、CondaValueError: Malformed version string invalid character(s),希望能对使用conda的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 2.1 步骤一 2.2 步骤二

weixin_43178406的博客 8万+

深入理解SVM之对偶问题

当年看SVM时,对SVM最优化求解过程中对偶问题的一些方面还有些迷糊,今天看到有人写的一系列博客,用来深入了解这方面比较好,转载如下,源地址为:http://blog.youkuaiyun.com/vivihe0/article/details/7019826。 ———————————————————————————————————————————————————————————————— 第一部

5644

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ACM 算法实现

实验一 统计数字问题 1、问题描述:一本书的页码从自然数1 开始顺序编码直到自然数n。书的页码按照通常的习惯编排,每个页码都不含多余的前导数字0。例如,第6 页用数字6 表示,而不是06 或006 等。数字计数问题要求对给定书的总页码n,计算出书的全部页码中分别用到多少次数字0,1, 2,…,9。2、题目分析:考虑由0,1,2,…,9组成的所有n位数。从n个0到n个9共有个n位数,在这些n位数中...

weixin_34259159的博客 173

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

P4722 【模板】最大流

P4722 【模板】最大流 加强版 / 预流推进 今日心血来潮,打算学习hlpp 然后学了一阵子。发现反向边建错了。容量并不是0.qwq 然后就荒废了一晚上。 算法流程的话。有时间补上 #include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include...

weixin_33901926的博客 188

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

2021-05-22

二分查找(最最问题) 将最最问题 即最大间隙最小值 或者最小间隙的最大值问题转化成左右边界问题 左边界 最小值最大化 int left(int*nums, int target) { if (nums.length == 0) return -1; int left = 0; int right = nums.length; // 注意 while (left < right) { // 注意 int mid = (left + right) / 2;

qq_55827300的博客 182

分布式排序

周六早晨, 从Leetcode的问题开始, 读代码感觉可读性太差; 知道了算法, 却抽象思维跟不上代码. Here is the leetcode link I am reading in the morning: http://yucoding.blogspot.ca/2014/12/leetcode-question-maximum-gap.html And then, f...

weixin_30597269的博客 206

线性时间求最大区间间隔

来源: 给定n个实数x1,x2,...,xn,求这n个实数在实轴上相邻2个数之间的最大差值M,要求设计线性的时间算法  最大间隙问题。 要求线性时间算法。需要使用桶排序。桶排序的平均时间复发度是O(N).如果桶排序的数据分布不均匀,假设都分配到同一个桶中,最坏情况下的时间复杂度将变为O(N^2). 以下引用其他人的算法详解及一些个人理解。 桶排序: 最关键的建桶,如果

小乌龟的专栏 804

LeetCode 42. Trapping Rain Water(Hard)

查看原文,请点击彼得.攀的小站 查阅更多的题解,请点击 Problem 42. Trapping Rain Water(Hard) Given n non-negative integers representing an elevation map where the width of each bar is 1, compute how much water it is able to tra...

彼得.攀的blog 381
上一篇: Java实验(八)· 多线程 · 四川师范大学《JAVA》实验报告 八
下一篇: 常见的算法时间复杂度计算分析-总结
wang__Ray
博客等级 码龄8年 59粉丝 17原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值