528. Random Pick with Weight
Posted tobeabetterpig
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了528. Random Pick with Weight相关的知识,希望对你有一定的参考价值。
Given an array w of positive integers, where w[i] describes the weight of index i, write a function pickIndex which randomly picks an index in proportion to its weight. Note: 1. 1 <= w.length <= 10000 2. 1 <= w[i] <= 10^5 3. pickIndex will be called at most 10000 times. Example 1: Input: ["Solution","pickIndex"] [[[1]],[]] Output: [null,0] Example 2: Input: ["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"] [[[1,3]],[],[],[],[],[]] Output: [null,0,1,1,1,0] Explanation of Input Syntax: The input is two lists: the subroutines called and their arguments. Solution‘s constructor has one argument, the array w. pickIndex has no arguments. Arguments are always wrapped with a list, even if there aren‘t any. https://blog.csdn.net/fuxuemingzhu/article/details/81807215 // In the case w = [1, 99] , your pickIndex() should return index 1 for 99% and index 0 for 1%. // index 0 has weight 1 // index 1 has weight 99 // the total weight is 100, so index 0 has 1/100, and index 1 has 99/100 // we can use bianry search for this problem // not my code class Solution { List<Integer> psum = new ArrayList<>(); int tot = 0; Random rand = new Random(); public Solution(int[] w) { for (int x : w) { tot += x; psum.add(tot); } } public int pickIndex() { int targ = rand.nextInt(tot); int lo = 0; int hi = psum.size() - 1; while (lo != hi) { int mid = (lo + hi) / 2; if (targ >= psum.get(mid)) lo = mid + 1; else hi = mid; } return lo; } } https://leetcode.com/problems/random-pick-with-weight/solution/
以上是关于528. Random Pick with Weight的主要内容,如果未能解决你的问题,请参考以下文章
leetcode 528. Random Pick with Weight
[leetcode]528. Random Pick with Weight按权重挑选索引
LeetCode 528. Random Pick with Weight / 497. Random Point in Non-overlapping Rectangles