日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

164. Maximum Gap

發(fā)布時間:2023/11/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 164. Maximum Gap 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目:
Given an unsorted array, find the maximum difference between the successive elements in its sorted form.

Try to solve it in linear time/space.

Return 0 if the array contains less than 2 elements.

You may assume all elements in the array are non-negative integers and fit in the 32-bit signed integer range.

解答:
這題挺難理解的,但是可以舉例,比如說現(xiàn)在有1, 3, 5, 9。那么我們可以把它分成3個bucket來裝,min表示在這個bucket范圍中,存在的最小數(shù)和最大數(shù)。這個bucket的長度是最小可能的最大差值。(如果哪個差值比這個還小,那么為了填補這個小差值,就必然存在另一個差值比它大,那么這個數(shù)組的最大差值就比當前bucket大。所以均分下來的bucket是最小可能的最大差值)

b0: (1, 3) min = Integer.max, max = Integer.min
b1: (4, 6) min = Integer.max, max = Integer.min
b2: (7, 9) min = Integer.max, max = Integer.min

然后我們來看這個數(shù)組里的數(shù)在哪個bucket里,用(nums(i) - min) / gap來得到,
第一個數(shù)1在b0中,所以我們更新:
b0: (1, 3) min = 1, max = 1;
第二個數(shù)3在b0中,所以我們更新:
b0: (1, 3) min = 1, max = 3;
第三個數(shù)5在b1中,所以我們更新:
b1: (4, 6) min = 5, max = 5;
.
.
依次這樣下去。
因為每個bucket中的最大值-最小值就是我們最小的gap, 所以我們不用計算相鄰的兩個數(shù),我們只要比較后一個bucket中的最小值和前一個bucket中的最大值相差多少,取最大相差的值就是最終的結果。注意考慮min和max兩個邊界值也要加進去。

public int maximumGap(int[] nums) {if (nums == null || nums.length < 2) return 0;int len = nums.length;int max = nums[0], min = nums[0];for (int i = 0; i < nums.length; i++) {max = Math.max(max, nums[i]);min = Math.min(min, nums[i]);}//Math.ceil與最小的比這個數(shù)大的蒸熟,使bucket可以包含所有數(shù)int gap = (int)Math.ceil((double)(max - min) / (len - 1));int[] BucketsMIN = new int[len - 1];int[] BucketsMAX = new int[len - 1];Arrays.fill(BucketsMIN, Integer.MAX_VALUE);Arrays.fill(BucketsMAX, Integer.MIN_VALUE);for (int num : nums) {//不考慮邊界,所以把邊界的min和max都拿出來,單獨再考慮if (num == min || num == max) continue;int bucket = (num - min) / gap;BucketsMIN[bucket] = Math.min(BucketsMIN[bucket], num);BucketsMAX[bucket] = Math.max(BucketsMAX[bucket], num);}int result = 0;int previous = min;for (int i = 0; i < len - 1; i++) {if (BucketsMIN[i] == Integer.MAX_VALUE && BucketsMAX[i] == Integer.MIN_VALUE) {continue;}result = Math.max(result, BucketsMIN[i] - previous);previous = BucketsMAX[i];}result = Math.max(result, max - previous);return result;}

總結

以上是生活随笔為你收集整理的164. Maximum Gap的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。