LeetCode刷题笔记 MaxGap 最大间距
作者:互联网
LeetCode刷题笔记
LeeCode题目:T164 MaxGap 最大间距
给定一个数组,求如果排序之后,相邻两数的最大差值,要求时间复杂度O(N),且不能用非基于比较的排序
方法
借用桶排序思想可巧妙解决该问题。无需对数组排序即可找到最大差值。
- 全新的界面设计 ,将会带来全新的写作体验;
- 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
- 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
- 全新的 KaTeX数学公式 语法;
- 增加了支持甘特图的mermaid语法1 功能;
- 增加了 多屏幕编辑 Markdown文章功能;
- 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
- 增加了 检查列表 功能。
代码
public static int maxGap(int[] arr){
if(arr == null || arr.length<2){
return 0;
}
int len = arr.length;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int i = 0; i < len; i++) {
min = Math.min(min,arr[i]);
max = Math.max(max,arr[i]);
}
if(min == max){//说明数组里的数都是同一个数
return 0; }
//桶里只记录 1、最小值 2、最大值 3、当前桶里是否有数
boolean[] hasNum = new boolean[len+1];
int[] mins = new int[len+1];
int[] maxs = new int[len+1];
int bid = 0;//桶的编号,从0开始
//把数组的数依次放入对应的桶里
for (int i = 0; i < len; i++) {
bid = bucket(arr[i],len,min,max);
//更新桶的最小值与最大值
mins[bid] = hasNum[bid] ? Math.min(mins[bid],arr[i]) : arr[i];
maxs[bid] = hasNum[bid] ? Math.max(maxs[bid],arr[i]) : arr[i];
hasNum[bid] = true;//此时,桶内进数了 状态变为true
}
int res = 0; //记录最大差值
int lastMax = maxs[0]; // 初始化前桶的最大值
int i = 1;
for ( ; i<= len ; i++) { // 从i=1 开始的桶计算与前筒的差值
if(hasNum[i]){//如果是空的直接跳过
res = Math.max(res,mins[i] - lastMax);
//后非空桶的最小值减去前非空桶最大值(数组相邻两数的差值),赋给res
lastMax = maxs[i];//桶向后移动
}
}
return res;
}
// 数num应该入几号桶
public static int bucket(long num, long len ,long min, long max){
// 防止(num-min)*len 溢出 转为long型
return (int)((num-min)*len/(max-min));
}
标签:arr,min,MaxGap,max,bid,len,int,LeetCode,刷题 来源: https://blog.csdn.net/weixin_44856492/article/details/115049651