528:按权重随机选择

This commit is contained in:
huangge1199 2021-08-30 12:46:05 +08:00
parent c8fd3a96ba
commit 51f5cd02f7
3 changed files with 166 additions and 1 deletions

View 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.7575%
//
// 也就是说选取下标 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

View File

@ -0,0 +1,57 @@
<p>给定一个正整数数组&nbsp;<code>w</code> ,其中&nbsp;<code>w[i]</code>&nbsp;代表下标 <code>i</code>&nbsp;的权重(下标从 <code>0</code> 开始),请写一个函数&nbsp;<code>pickIndex</code>&nbsp;,它可以随机地获取下标 <code>i</code>,选取下标 <code>i</code>&nbsp;的概率与&nbsp;<code>w[i]</code>&nbsp;成正比。</p>
<ol>
</ol>
<p>例如,对于 <code>w = [1, 3]</code>,挑选下标 <code>0</code> 的概率为 <code>1 / (1 + 3)&nbsp;= 0.25</code> 25%),而选取下标 <code>1</code> 的概率为 <code>3 / (1 + 3)&nbsp;= 0.75</code>75%)。</p>
<p>也就是说,选取下标 <code>i</code> 的概率为 <code>w[i] / sum(w)</code></p>
<p>&nbsp;</p>
<p><strong>示例 1</strong></p>
<pre><strong>输入:</strong>
[&quot;Solution&quot;,&quot;pickIndex&quot;]
[[[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>
[&quot;Solution&quot;,&quot;pickIndex&quot;,&quot;pickIndex&quot;,&quot;pickIndex&quot;,&quot;pickIndex&quot;,&quot;pickIndex&quot;]
[[[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>&nbsp;</p>
<p><strong>提示:</strong></p>
<ul>
<li><code>1 &lt;= w.length &lt;= 10000</code></li>
<li><code>1 &lt;= w[i] &lt;= 10^5</code></li>
<li><code>pickIndex</code>&nbsp;将被调用不超过&nbsp;<code>10000</code>&nbsp;</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>