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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

leetcode164. 最大间距 借桶思想秒掉hard题

發布時間:2023/12/13 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leetcode164. 最大间距 借桶思想秒掉hard题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給定一個無序的數組,找出數組在排序之后,相鄰元素之間最大的差值。

如果數組元素個數小于 2,則返回 0。

示例?1:

輸入: [3,6,9,1]
輸出: 3
解釋: 排序后的數組是 [1,3,6,9], 其中相鄰元素 (3,6) 和 (6,9) 之間都存在最大差值 3。
示例?2:

輸入: [10]
輸出: 0
解釋: 數組元素個數小于 2,因此返回 0。
說明:

你可以假設數組中所有元素都是非負整數,且數值在 32 位有符號整數范圍內。
請嘗試在線性時間復雜度和空間復雜度的條件下解決此問題。

思路:之前寫過,直接復制過來。

問題:

數組排序之后的相鄰數的最大差值;

嗯,你可以排序,然后找相鄰的最大差值。

但是你覺得這么簡單我寫他干啥。

最優解:時間復雜度O(N),空間O(1)

那我們開始說這種方法:

1)遍歷所有數,找到最小值和最大值:min和max

2)設數組長度為n,我們準備n+1個桶

3)把max放進最后一個桶里,min放到第一個桶里

4)每一個桶都負責放一個范圍內的數字,負責的范圍大小是(max-min)/n。

(比如長度為10,最小值為10,最大值為110,那么準備11個桶,第一個桶放[10,20)的數字,第二個桶放[20,30)的數字......)

重點來啦:因為有n+1個桶,有n個數字,我們就發現了一個問題:必定會有空的桶

為什么我們一定要有空的桶呢?

這樣我們就可以做到:桶內的相鄰數字的差,一定沒有不同桶之間的數字的差大

有了這個結論我們可以做什么呢?

其實找相鄰桶和桶之間的差就好啦,桶內的那些情況根本不用關心

想到這里,我們發現桶里根本不用關心到底有幾個數,他們的差是多少,只要記錄每個桶的最大值最小值即可。

?

最后一點小問題啦:對于一個數num,他應該放在哪個桶,最好推個公式吧?
它應該被放在(num-min)*len/(max-min)這個桶里。也不難推。

最后就是寫代碼啦。

class Solution {public int maximumGap(int[] nums) {if (nums == null || nums.length < 2) {return 0;}int len = nums.length;int min = Integer.MAX_VALUE;int max = Integer.MIN_VALUE;for (int i = 0; i < len; i++) {min = Math.min(min, nums[i]);max = Math.max(max, nums[i]);}if (min == max) {return 0;}boolean[] hasNum = new boolean[len + 1];//記錄是否空int[] maxs = new int[len + 1];//桶內最大值int[] mins = new int[len + 1];//桶內最小值int bid = 0;//放入桶中for (int i = 0; i < len; i++) {bid = bucket(nums[i], len, min, max);mins[bid] = hasNum[bid] ? Math.min(mins[bid], nums[i]) : nums[i];maxs[bid] = hasNum[bid] ? Math.max(maxs[bid], nums[i]) : nums[i];hasNum[bid] = true;}int res = 0;int lastMax = maxs[0];int i = 1;//相鄰桶求最大差值for (; i <= len; i++) {if (hasNum[i]) {res = Math.max(res, mins[i] - lastMax);lastMax = maxs[i];}}return res;}public int bucket(long num, long len, long min, long max) {return (int) ((num - min) * len / (max - min));} }

?

總結

以上是生活随笔為你收集整理的leetcode164. 最大间距 借桶思想秒掉hard题的全部內容,希望文章能夠幫你解決所遇到的問題。

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