398. 随机数索引Normal水塘抽样算法

Posted pre_eminent

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了398. 随机数索引Normal水塘抽样算法相关的知识,希望对你有一定的参考价值。

题目:

给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。

您可以假设给定的数字一定存在于数组中。

注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。


示例:

int[] nums = new int[] 1,2,3,3,3;
Solution solution = new Solution(nums);

// pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。
solution.pick(3);

// pick(1) 应该返回 0。因为只有nums[0]等于1。
solution.pick(1);


思路:

生成随机数,

等于1/i的概率时,就替换结果


解答:

/**
 * @param number[] nums
 */
var Solution = function(nums) 
    // 构造函数记录下数组
    this.nums = nums;
;

/** 
 * @param number target
 * @return number
 */
Solution.prototype.pick = function(target) 
    // 注意初始n 为1
    let n = 1;
    let res = 0;
    for(let i = 0;i < this.nums.length;i++)
        let num = this.nums[i];
        if(num === target)
            // [0,1)
            let r = Math.random(1);
            let p = Math.floor(r * n);
            // 如果有1/n的概率被选中
            if(p === 0)
                res = i;
            
            n++;
        
    
    return res;
;

/**
 * Your Solution object will be instantiated and called as such:
 * var obj = new Solution(nums)
 * var param_1 = obj.pick(target)
 */

以上是关于398. 随机数索引Normal水塘抽样算法的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 868. 二进制间距 / 398. 随机数索引(水塘抽样) / 883. 三维形体投影面积

382. 链表随机节点Normal水塘抽样算法

利用水塘抽样来解决“随机数索引“问题

利用水塘抽样来解决“随机数索引“问题

利用水塘抽样来解决“随机数索引“问题

水塘抽样算法与等概率证明