2022-9-8 剑指offer-前缀和+二分

剑指 Offer II 071. 按权重生成随机数

难度中等

给定一个正整数数组 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 class Solution {
 2     int[] arr;
 3     int[] w1;
 4     int s;
 5     public Solution(int[] w) {
 6         int sum=0;
 7         arr=new int[w.length];
 8         w1=new int[w.length];
 9         for (int i=0;i<w.length;i++){
10             sum+=w[i];
11             arr[i]=sum;
12         }
13         s=sum;
14         w1=w;
15     }
16     
17     public int pickIndex() {
18         int index=Arrays.binarySearch(arr,new Random().nextInt(s)+1);
19         if (index>=0) return index;
20         else if (-index-1==w1.length) return w1.length;
21         else return -index-1;
22     }
23 }
24 
25 /**
26  * Your Solution object will be instantiated and called as such:
27  * Solution obj = new Solution(w);
28  * int param_1 = obj.pickIndex();
29  */

思路:前缀和 加随机数二分查找,注意random.nextInt(n) 是0~n-1

arrays自带的二分查找的index为正是找到了,负数表示-index-1为插入位置

posted on 2022-09-08 14:55  阿ming  阅读(19)  评论(0编辑  收藏  举报

导航