ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Kimi LeetCode 164.最大间距 Java实现

Kimi    LeetCode 164.最大间距 Java实现 LeetCode 164. 最大间距 — Java 实现题目要求返回数组在排序后相邻元素之间的最大差值。要求 O(n) 时间线性时间排序如桶排序。思路一桶排序推荐O(n)O(n)O(n)核心思想排序后的n个数有n-1个间隔。设minVal、maxVal则最大间距的下界为\textit{lowerBound} \left\lceil \frac{\textit{maxVal} - \textit{minVal}}{n - 1} \right\rceil让每个桶的宽度等于lowerBound则同一个桶内的任意两数之差一定小于lowerBound所以最大间距不可能出现在同一个桶内只可能出现在相邻桶之间前一个桶的最大值与后一个桶的最小值之差。importjava.util.Arrays;classSolution{publicintmaximumGap(int[]nums){intnnums.length;if(n2)return0;intminValArrays.stream(nums).min().getAsInt();intmaxValArrays.stream(nums).max().getAsInt();if(minValmaxVal)return0;// 桶宽度 最大间距的下界intbucketSizeMath.max(1,(maxVal-minVal)/(n-1));// 桶数量 数值范围 / 桶宽度 1intbucketCount(maxVal-minVal)/bucketSize1;// 每个桶只记录最小值、最大值、是否为空int[]bucketMinnewint[bucketCount];int[]bucketMaxnewint[bucketCount];boolean[]hasNumnewboolean[bucketCount];for(intnum:nums){intidx(num-minVal)/bucketSize;if(!hasNum[idx]){bucketMin[idx]bucketMax[idx]num;hasNum[idx]true;}else{bucketMin[idx]Math.min(bucketMin[idx],num);bucketMax[idx]Math.max(bucketMax[idx],num);}}// 遍历非空桶计算前一个非空桶的最大值与当前桶的最小值之差intmaxGap0;intprevMaxminVal;for(inti0;ibucketCount;i){if(!hasNum[i])continue;maxGapMath.max(maxGap,bucketMin[i]-prevMax);prevMaxbucketMax[i];}returnmaxGap;}}时间复杂度O(n)空间复杂度O(n)思路二直接排序O(nlog⁡n)O(n \log n)O(nlogn)如果不追求线性时间一行排序即可importjava.util.Arrays;classSolution{publicintmaximumGap(int[]nums){if(nums.length2)return0;Arrays.sort(nums);intmaxGap0;for(inti1;inums.length;i){maxGapMath.max(maxGap,nums[i]-nums[i-1]);}returnmaxGap;}}关键点总结鸽巢原理n个数分布在(max-min)的范围里最大间距至少是(max-min)/(n-1)这是桶宽的来源。为什么只比较相邻非空桶同桶内差值 桶宽 ≤ 答案下界不可能是最优解因此最大间距只可能跨桶产生。桶内只需存 min/max无需真正排序桶内元素。示例nums [3,6,9,1]→ 排序后为[1,3,6,9]最大间距为39-6✅
返回列表