528:按权重随机选择
This commit is contained in:
parent
c8fd3a96ba
commit
51f5cd02f7
108
src/main/java/leetcode/editor/cn/RandomPickWithWeight.java
Normal file
108
src/main/java/leetcode/editor/cn/RandomPickWithWeight.java
Normal file
@ -0,0 +1,108 @@
|
||||
//给定一个正整数数组 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 次
|
||||
//
|
||||
// Related Topics 数学 二分查找 前缀和 随机化 👍 143 👎 0
|
||||
|
||||
package leetcode.editor.cn;
|
||||
|
||||
//528:按权重随机选择
|
||||
class RandomPickWithWeight {
|
||||
public static void main(String[] args) {
|
||||
//测试代码
|
||||
// Solution solution = new RandomPickWithWeight().new Solution();
|
||||
}
|
||||
|
||||
//力扣代码
|
||||
//leetcode submit region begin(Prohibit modification and deletion)
|
||||
class Solution {
|
||||
private int[] arr;
|
||||
private int[] weight;
|
||||
|
||||
public Solution(int[] w) {
|
||||
arr = w;
|
||||
weight = new int[w.length];
|
||||
weight[0] = arr[0];
|
||||
for (int i = 1; i < arr.length; i++) {
|
||||
weight[i] = weight[i - 1] + arr[i];
|
||||
}
|
||||
}
|
||||
|
||||
public int pickIndex() {
|
||||
int start = 0;
|
||||
int end = weight.length - 1;
|
||||
int max = (int) (Math.random() * weight[end]) + 1;
|
||||
while (start < end) {
|
||||
int mid = (end - start) / 2 + start;
|
||||
if (weight[mid] < max) {
|
||||
start = mid + 1;
|
||||
} else {
|
||||
end = mid;
|
||||
}
|
||||
}
|
||||
return start;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Your Solution object will be instantiated and called as such:
|
||||
* Solution obj = new Solution(w);
|
||||
* int param_1 = obj.pickIndex();
|
||||
*/
|
||||
//leetcode submit region end(Prohibit modification and deletion)
|
||||
|
||||
}
|
File diff suppressed because one or more lines are too long
@ -0,0 +1,57 @@
|
||||
<p>给定一个正整数数组 <code>w</code> ,其中 <code>w[i]</code> 代表下标 <code>i</code> 的权重(下标从 <code>0</code> 开始),请写一个函数 <code>pickIndex</code> ,它可以随机地获取下标 <code>i</code>,选取下标 <code>i</code> 的概率与 <code>w[i]</code> 成正比。</p>
|
||||
|
||||
<ol>
|
||||
</ol>
|
||||
|
||||
<p>例如,对于 <code>w = [1, 3]</code>,挑选下标 <code>0</code> 的概率为 <code>1 / (1 + 3) = 0.25</code> (即,25%),而选取下标 <code>1</code> 的概率为 <code>3 / (1 + 3) = 0.75</code>(即,75%)。</p>
|
||||
|
||||
<p>也就是说,选取下标 <code>i</code> 的概率为 <code>w[i] / sum(w)</code> 。</p>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>示例 1:</strong></p>
|
||||
|
||||
<pre><strong>输入:</strong>
|
||||
["Solution","pickIndex"]
|
||||
[[[1]],[]]
|
||||
<strong>输出:</strong>
|
||||
[null,0]
|
||||
<strong>解释:</strong>
|
||||
Solution solution = new Solution([1]);
|
||||
solution.pickIndex(); // 返回 0,因为数组中只有一个元素,所以唯一的选择是返回下标 0。</pre>
|
||||
|
||||
<p><strong>示例 2:</strong></p>
|
||||
|
||||
<pre><strong>输入:</strong>
|
||||
["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
|
||||
[[[1,3]],[],[],[],[],[]]
|
||||
<strong>输出:</strong>
|
||||
[null,1,1,1,1,0]
|
||||
<strong>解释:</strong>
|
||||
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]
|
||||
......
|
||||
诸若此类。
|
||||
</pre>
|
||||
|
||||
<p> </p>
|
||||
|
||||
<p><strong>提示:</strong></p>
|
||||
|
||||
<ul>
|
||||
<li><code>1 <= w.length <= 10000</code></li>
|
||||
<li><code>1 <= w[i] <= 10^5</code></li>
|
||||
<li><code>pickIndex</code> 将被调用不超过 <code>10000</code> 次</li>
|
||||
</ul>
|
||||
<div><div>Related Topics</div><div><li>数学</li><li>二分查找</li><li>前缀和</li><li>随机化</li></div></div><br><div><li>👍 143</li><li>👎 0</li></div>
|
Loading…
Reference in New Issue
Block a user