二分查找-中等-按权重随机选择

前言        好久没有抽时间刷题了,突然发现leetcode有个random标签,就好奇这下面是什么类型的题,结果没想到碰巧看到了这个在公司游戏化教学项目也有涉及的问题,遂顺手甩一篇题解。        在本文中,我会先给出该题的...
摘要由CSDN通过智能技术生成

前言

        好久没有抽时间刷题了,突然发现leetcode有个random标签,就好奇这下面是什么类型的题,结果没想到碰巧看到了这个在公司游戏化教学项目也有涉及的问题,遂顺手甩一篇题解。

        在本文中,我会先给出该题的题解。之后,在后文的『扩展延伸』中给出该题缩小数据范围后的另一种更高效的解法,以及我在全日制游戏项目中遇到的与该问题相似的案例

        这题主要考点是二分查找,以及能否灵活的转化问题。此外,如果权值数组w的长度范围没那么长,权值范围没那么大的话,考点就从二分查找变为哈希了。具体可以看我后文中的扩展延伸。

题目来源(点击跳转)

题解

解析

        基本思想就是把各个位置的权值表现为在一个数值范围中占据的区间。具体过程为,构造一个总长度为权值列表w中各值之和sumWeight的列表weightRoute。在随机选取位置时,rand一个数值weight,此时,若存在下标index,使 w e i g h t ∈ [ w e i g h t R o u t e [ i n d e x ] , w e i g h t R o u t e [ i n d e x + 1 ] ) weight \in [weightRoute[index], weightRoute[index+1] ) weight[weightRoute[index],weightRoute[index+1]),则下标index即为我们要获取的坐标。后续搜索阶段的二分查找是基本操作了,思想也很简单,这里就不赘述了。

代码

        构造阶段,时间复杂度为O(n),搜索阶段时间复杂度为O(logn)。

class Solution {
   

    protected $sumWeight;
    protected $length;
    protected $weightRoute = [0];
    
    function __construct(array $w) {
   
        // sum total
        $this->sumWeight 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值