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

299 阅读1分钟

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

  • 例如 [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());