给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
思路:蓄水池抽样
最后留下的概率=进入的概率*进入之后不被换出的概率
- 此题只要选1个数,即m=1,i记录有几个符合条件的数,即N
- 遇到target,i+1,然后以此时的1/i概率更新选中的数res
- 由上述证明,每个数留在m里的概率都为1/N
class Solution:
def __init__(self, nums: List[int]):
self.nums=nums
def pick(self, target: int) -> int:
count=0
res=0
for i in range(len(self.nums)):
if self.nums[i]==target:
count+=1
# 取1的概率为1/i,1/i的概率更新取值,同时1/i的概率被换出
if random.randint(1,count)==1:
res=i
return res
class Solution {
int[] nums;
public Solution(int[] nums) {
this.nums=nums;
}
public int pick(int target) {
Random r=new Random();
int count=0;
int res=0;
for(int i=0;i<nums.length;i++) {
if(nums[i]==target){
count+=1;
if(r.nextInt(count)==0){
res=i;
}
}
}
return res;
}
}