[Leetcode] maximum gap
2015-08-20 15:17
323 查看
[1] https://leetcode.com/problems/maximum-gap/
这里具有使用桶的思想来对整数进行规整,通过详细的设计桶的大小,可以保证最大间隔一定大于等于桶的大小,从而保证最大间隔不会出现在桶的内部,而是桶之间。
这里的关键是如何设计桶的大小?
假设N个数字,均等分布,那么间隔是(max - min)/(N-1)
如果不是均等分布,一定存在大于(max - min)/(N-1)的间隔。
所以最大的间隔一定大于等于(max - min)/(N-1)
上面的证明,实际上有一个非常强的前提:(max - min)%(N-1)==0,但是实际当中并不一定是整除的情形,这时我们要对这个间隔上取整,即
ceil((max - min)/(N-1))
我是亮丽的分割线
证明:
假设所有的gap都是小于等于floor((max - min)/(N-1))的,那么
$min + \sum_{i=1}^{N-1}gap \le max$
所以至少存在一个gap大于$floor((max - min)/(N-1))$的,或者是大于等于$ceil((max - min)/(N-1))$的
这说明最大的gap不会比$ceil((max - min)/(N-1))$小。
在桶的内部,gap都是小于这个值得,所以最大的gap只能存在于桶之间。
这里的$ceil((max - min)/(N-1))$是一个非常极端的情况,桶只要尽可能的小都是对的,比如$ceil((max - min)/N)$
这里具有使用桶的思想来对整数进行规整,通过详细的设计桶的大小,可以保证最大间隔一定大于等于桶的大小,从而保证最大间隔不会出现在桶的内部,而是桶之间。
这里的关键是如何设计桶的大小?
假设N个数字,均等分布,那么间隔是(max - min)/(N-1)
如果不是均等分布,一定存在大于(max - min)/(N-1)的间隔。
所以最大的间隔一定大于等于(max - min)/(N-1)
上面的证明,实际上有一个非常强的前提:(max - min)%(N-1)==0,但是实际当中并不一定是整除的情形,这时我们要对这个间隔上取整,即
ceil((max - min)/(N-1))
我是亮丽的分割线
证明:
假设所有的gap都是小于等于floor((max - min)/(N-1))的,那么
$min + \sum_{i=1}^{N-1}gap \le max$
所以至少存在一个gap大于$floor((max - min)/(N-1))$的,或者是大于等于$ceil((max - min)/(N-1))$的
这说明最大的gap不会比$ceil((max - min)/(N-1))$小。
在桶的内部,gap都是小于这个值得,所以最大的gap只能存在于桶之间。
这里的$ceil((max - min)/(N-1))$是一个非常极端的情况,桶只要尽可能的小都是对的,比如$ceil((max - min)/N)$
public class Solution { public int maximumGap(int[] nums) { if(nums==null||nums.length==0||nums.length==1) return 0; int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; for(int i: nums){ max = Math.max(max,i); min = Math.min(min,i); } //backet size应该尽量小 // int backetsize = (int)Math.ceil((double)(max - min)/(nums.length)); int [] maxmin = new int[3* nums.length]; for(int i=0;i<maxmin.length;i++) maxmin[i]=-1; for(int i=0;i<nums.length;i++){ int num = nums[i]; int backetindex = (num - min)/backetsize; if(maxmin[backetindex*2]==-1){ maxmin[backetindex*2]=maxmin[backetindex*2+1]=num; }else{ maxmin[backetindex*2+1] = Math.max(maxmin[backetindex*2+1],num); maxmin[backetindex*2] = Math.min(maxmin[backetindex*2],num); } } //search for the maximum gap int pre = -1; int maxgap = -1; for(int i=0;i<nums.length;i++){ if(maxmin[2*i+1]!=-1&&pre==-1){ pre =maxmin[2*i+1]; continue; } if(maxmin[2*i]!=-1){ maxgap = Math.max(maxgap,maxmin[2*i]-pre); pre = maxmin[2*i+1]; } } return maxgap; } }
相关文章推荐
- 字符串匹配的KMP算法
- iOS循环引用
- array_multisort — 对多个数组或多维数组进行排序
- Apple Watch和机械手表的纠结
- Minimum Path Sum
- JFrame实现圆角窗体
- 黑马程序员-[OC语言] 第五篇:block使用、协议概述
- array_multisort — 对多个数组或多维数组进行排序
- 同一服务器上启动多个数据库的方法及常见问题
- Centos6.6 PXE+Kickstart
- 卡尔曼滤波的原理说明
- public protected private 解析
- js时钟
- ORA-12519, TNS:no appropriate service handler found
- scrolllistview_学习笔记
- 线程与进程的关系
- SignalR系列续集[系列6:使用自己的连接ID]
- BootStrap图标
- ie浏览器用js读取excel数据
- android 应用程序窗口小部件