2022-9-8 剑指offer-前缀和+二分
给定一个正整数数组 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为插入位置