题目描述:

给定n个实数 x1 , x2 , … , xn ,求这n个数在实轴上相邻2个数之间的最大差值。假设对任何实数的下取整方法耗时O(1),设计解最大间隙问题的线性时间算法。

对于给定的n个实数 x1 , x2 , … , xn ,计算它们的最大间隙。

Input
输入数据的第一行有1个正整数n ( 1 < n ≤ 200000 )。接下来的1行是n个实数 x1 , x2 , … , xn 。

Output
输出找到的最大间隙。

Sample Input
5
2.3 3.1 7.5 1.5 6.3

Sample Output
3.2

题解:

最先想到的是去排序后计算,但是排序时间复杂度最少也要O(nlongn),不满足题目线性时间复杂度的要求,故要想别的算法。

以下算法学习自最大间隙问题:

拓展鸽笼原理(抽屉原理),即为桶排序,在输入过程中找出数据的最大值max_与最小值min_,在【min_,max_】区间内,将最大值与最小值之间进行均分成n-1份,每个区间的大小为 len = (max_ - min_)/(n-1),即此时为n-1个桶,将最大值最小值人为放置于第一个桶和最后一个桶中,分别代表了各自桶的下限和上限。根据这个判断剩余的n-2个元素放置的桶的位置,因为有n-1个桶需要放置n-2个元素所以根据抽屉原理必定有一个桶是空的,所以,最大间隙一定产生在两个不同区间之间(即两个桶之间,就是跨区间的数才可能产生最大的间隙 ),故最大的间隙一定是一个桶所放数据的最小值与另一个桶所放数据的最大值之间的差值。

贴上本人AC代码:

#include<stdio.h>
#include<string.h>
#define inf 0x3f3f3f3f
struct node
{double max1,min1;//每个桶中存放的数据的最大以及最小值int sum;//计算桶中存放的数据的个数,该结构体定义在全局,故sum自动初始化为0
};
double a[200005];
struct node x[200005];//相当于桶
int main()
{int n;scanf("%d",&n);for(int l=0;l<200005;l++){  //初始化x[l].max1=-inf,x[l].min1=inf;}double max_=-inf,min_=inf;for(int i=0;i<n;i++){scanf("%lf",&a[i]);if(a[i]>max_)max_=a[i];//寻找输入数据的最大值if(a[i]<min_)min_=a[i];//寻找输入数据的最小值}if(n==2){ //特判printf("%.1f\n",max_-min_);return 0;}double len=(max_-min_)/(n-1.0);//每个桶的大小/*将数据放进桶里*/for(int i=0;i<n;i++){int t=(a[i]-min_)/len;//计算该数据要放进第几个桶x[t].sum++;//计算该桶内存放了几个数if(a[i]>x[t].max1)x[t].max1=a[i];//寻找存放在该桶内的数据的最大一个if(a[i]<x[t].min1)x[t].min1=a[i];//寻找存放在该桶内的数据的最小一个}double max5=-inf;for(int i=1;i<=n-1;i++){if(x[i].sum==0){x[i].min1=x[i-1].max1;x[i].max1=x[i].min1;}if(x[i].min1-x[i-1].max1>max5)max5=x[i].min1-x[i-1].max1;}printf("%.1f\n",max5);return 0;
}

最大间隙(线性时间算法——鸽笼原理)相关推荐

  1. 12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用

    0.前言 从这一部分开始直接切入我们计算机互联网笔试面试中的重头戏算法了,初始的想法是找一条主线,比如数据结构或者解题思路方法,将博主见过做过整理过的算法题逐个分析一遍(博主当年自己学算法就是用这种比 ...

  2. 输油管道问题(线性时间解决)

    输油管道问题 某石油公司计划建造一条由东向西的主输油管道.该管道要穿过一个有 n口油井的油田.从每口油井都要有一条输油管道沿南北向最短路经与主管道相连.如果给定 n 口油井的地理位置,即它们的 x 坐 ...

  3. 时间排序python_算法导论 第八章 线性时间排序(python)

    比较排序:各元素的次序依赖于它们之间的比较{插入排序O(n**2) 归并排序O(nlgn) 堆排序O(nlgn)快速排序O(n**2)平均O(nlgn)} 本章主要介绍几个线性时间排序:(运算排序非比 ...

  4. 最坏情况为线性时间的选择算法

    最坏情况为线性时间的选择算法 参考:[算法]算法导论:https://www.bilibili.com/video/BV1Tb411M7FA?p=6 提出问题:从一个数组中找到第K个最大数字,即TOP ...

  5. 多类线性分类器算法原理及代码实现 MATLAB

    多类线性分类器算法原理及代码实现 MATLAB 一.算法原理 下面举例说明为何蓝圈部分在case2中是确定的而在case1中不确定: 二.代码实现 1.HK函数 function [] = HK(w1 ...

  6. Fisher线性判别算法原理及实现 MATLAB

    Fisher线性判别算法原理及实现 MATLAB 一.Fisher判别器原理 二.代码实现 clc; close all; clear; %% 生成数据 rng(2020); %指定一个种子 mu1 ...

  7. 【算法学习】线性时间排序-计数排序、基数排序和桶排序详解与编程实现

    计数排序 计数排序假设n个输入元素中的每一个都是介于0到k之间的整数.此处k为某个整数(输入数据在一个小范围内). 算法思想 计数排序的基本思想是对每一个输入元素x,确定出小于x的元素的个数.然后再将 ...

  8. 最大子数组问题 线性时间_我最喜欢的线性时间排序算法

    最大子数组问题 线性时间 by Franziska Hinkelmann 通过Franziska Hinkelmann 我最喜欢的线性时间排序算法 (My Favorite Linear-time S ...

  9. 算法导论-线性时间排序习题解

    8.1-3 证明:对于长度为n的n!中输入中至少一半而言,不存在线性时间的比较排序算法.对于n!中的1/n部分而言又怎样呢?1/2n部分呢? 解:即在决策树模型中求1/2, 1/n, 1/2n 部分的 ...

最新文章

  1. SOCKET用法详解
  2. Rust语言开发基础(六)基础语法
  3. 概要设计阶段--组装测试计划
  4. 学习笔记-4.1用户管理命令
  5. [网络]_获取内外网IP地址【Auto.js】
  6. POJ1177矩形面积并(矩形切割+括号匹配)
  7. ensp小实验走起来(路由下发、MSTP、VRRP、DHCP、DHCP中继、NAT、链路聚合)之配置
  8. xp计算机用户密码设置,XP电脑开机密码怎么设置?
  9. Python学习 Week2 part1
  10. 手机拨不了急救电话 延误就医?魅族回应:仅是个例
  11. n-1 java_【Java】 剑指offer(53-2) 0到n-1中缺失的数字
  12. 根据sam文件计算reads的GC含量
  13. 数据库服务器的打开方式
  14. mysql归档模式_数据库归档模式设置步骤
  15. scikit-learn笔记
  16. C Primer Plus 第5章运算符、表达式和语句
  17. 商场室内地图导航如何实现,便捷、低成本智慧商业综合体一站式解决方案
  18. 完美世界手游服务器维护,完美世界手游更新失败_完美世界手游更新失败解决办法_玩游戏网...
  19. html生成真正的空图片代码 用canvas和script生成无实质性的空白图像 比图像透明处理还要牛 那种空白透明头像就是这么做出来的
  20. GIS实验之加权泰森多边形的应用

热门文章

  1. 单环碳氢化合物:有取代基的芳香族自由基
  2. python怎么打开ipynb文件_ipynb后缀文件怎么打开
  3. RocketMQ 消息队列中丢失消息的场景举例及解决办法
  4. window.onresize和window.addEventListener
  5. EOF的用法(while(scanf(“%d“,n) != EOF))和~取反的用法(while(~scanf(“%d“,n)))
  6. Linux基础命令---mkisofs
  7. revit打开服务器文件,Revit官方教程丨链接及打开IFC文件
  8. kubernetes (k8s) arm64 docker 镜像源
  9. 2021阿里巴巴技术笔试心得,理解透彻
  10. 低版本openssh升级到OpenSSH 8.5p1版本的方法