LeetCode 中等 528 按權重隨機選擇

2021-10-19 16:20:16 字數 2060 閱讀 1256

給定乙個正整數陣列 w ,其中 w[i] 代表下標 i 的權重(下標從 0 開始),請寫乙個函式 pickindex ,它可以隨機地獲取下標 i,選取下標 i 的概率與 w[i] 成正比。

例如,對於 w = [1, 3],挑選下標 0 的概率為 1 / (1 + 3) = 0.25 (即,25%),而選取下標 1 的概率為 3 / (1 + 3) = 0.75(即,75%)。

也就是說,選取下標 i 的概率為 w[i] / sum(w) 。

示例 1:

輸入:["solution","pickindex"]

[[[1]],]

輸出:[null,0]

解釋:solution solution = new solution([1]);

solution.pickindex(); // 返回 0,因為陣列中只有乙個元素,所以唯一的選擇是返回下標 0。

示例 2:

輸入:["solution","pickindex","pickindex","pickindex","pickindex","pickindex"]

[[[1,3]],,,,,]

輸出:[null,1,1,1,1,0]

解釋:solution solution = new solution([1, 3]);

solution.pickindex(); // 返回 1,返回下標 1,返回該下標概率為 3/4 。

solution.pickindex(); // 返回 1

solution.pickindex(); // 返回 1

solution.pickindex(); // 返回 1

solution.pickindex(); // 返回 0,返回下標 0,返回該下標概率為 1/4 。

由於這是乙個隨機問題,允許多個答案,因此下列輸出都可以被認為是正確的:

[null,1,1,1,1,0]

[null,1,1,1,1,1]

[null,1,1,1,0,0]

[null,1,1,1,0,1]

[null,1,0,1,0,0]

......

諸若此類。

1 <= w.length <= 10000

1 <= w[i] <= 10^5

pickindex 將被呼叫不超過 10000 次

// 時間複雜度:o(n) 的預處理。priceindex 需要花費 o(log(n))的時間。

// 空間複雜度:o(n)

class

solution

}public

intpickindex()

return lo;}}

/** * your solution object will be instantiated and called as such:

* solution obj = new solution(w);

* int param_1 = obj.pickindex();

*/// spring cloud ribbon (客戶端負載均衡)策略中的 weightedresponsetimerule

// 此題可簡述為「按權重,看作多個區間,按區間寬度越大,概率越大」

// 在 ribbon 相關架構中,服務端給客戶端乙個服務列表,類似 map> 結構。若客戶端想呼叫 key = servicea,可選的具體服務端例項有 set的 ["/svc/a1", "/svc/a2", "/svc/a3"],由客戶端自行決定

// ribbon 作為客戶端負載均衡來幫助客戶端選擇去哪個具體服務例項(a1 / a2 / a3),希望雨露均沾,又希望別運氣不好抽到響應慢的伺服器,故有了一種根據權重的均衡策略

// 權重是通過定時統計最近一段時間內,a1 / a2 / a3 各自的訪問響應時間如何,如 a1: 10ms,a2: 20ms,a3: 40ms

// 下次再需要訪問 servicea 時,隨機乙個數 [0, 140],看落在哪個區間,就選那個例項

// rabbitmq 的 topic 交換器使用 trie 匹配

// mysql 中的 in 語法涉及二分演算法

528 按權重隨機選擇 C

先將數字累加,然後壓入陣列中,由此得到一系列的區間。只要我們產生乙個隨機數,看落在哪個子區間就行了。例如,輸入3,2,5 就表示產生0的可能性佔3份,產生1的可能性佔2份,產生2的可能性佔5份,於是產生乙個陣列 3,5,10 再隨機生成乙個數,落在 0,10 上,判斷該隨機數落在哪個子區間就可以產生...

中等 201 數字範圍按位與

leetcode201 給定範圍 m,n 其中 0 m n 2147483647,返回此範圍內所有數字的按位與 包含 m,n 兩端點 示例 1 輸入 5,7 輸出 4 示例 2 輸入 0,1 輸出 0 該題在於找出m和n的公共字首,在按n的位數往後面補齊0.m到n之間的數都有該字首,則按位與操作使得...

LeetCode 542 01 矩陣 中等

給定乙個由 0 和 1 組成的矩陣,找出每個元素到最近的 0 的距離。兩個相鄰元素間的距離為 1 示例 1 輸入 0 0 0 0 1 0 0 0 0 輸出 0 0 0 0 1 0 0 0 0 示例 2 輸入 0 0 0 0 1 0 1 1 1 輸出 0 0 0 0 1 0 1 2 1 注意 給定矩陣...