-
例如
[1,2,3,4]累加和为[1,3,6,10] -
Math.random() 生成的值在
[0,1)内,*10得到[0,10) -
二分查找
-
如果满足
if (this.sums[mid] > p) {和this.sums[mid - 1] <= p,返回mid -
处理特殊情况
if (mid == 0 ||例如[1] 直接返回mid 为 0
var Solution = function (w) {
this.sums = new Array(w.length).fill(0);
this.total = 0;
for (var i = 0; i < w.length; i++) {
this.total += w[i];
this.sums[i] = this.total;
}
};
Solution.prototype.pickIndex = function () {
var p = Math.random() * this.total;
var left = 0;
var right = this.sums.length - 1;
while (left <= right) {
var mid = left + ((right - left) >> 1);
if (this.sums[mid] > p) {
if (mid == 0 || this.sums[mid - 1] <= p) {
return mid;
}
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
};
var p = new Solution([1, 2, 3, 4])
console.log(p.pickIndex());