作者: 负雪明烛
id: fuxuemingzhu
个人博客: http://fuxuemingzhu.cn/


题目地址:https://leetcode.com/problems/random-pick-with-weight/description/

题目描述:

Given an array w of positive integers, where w[i] describes the weight of index i, write a function pickIndex which randomly picks an index in proportion to its weight.

Note:

  1. 1 <= w.length <= 10000
  2. 1 <= w[i] <= 10^5
  3. pickIndex will be called at most 10000 times.

Example 1:

Input:
["Solution","pickIndex"]
[[[1]],[]]
Output: [null,0]

Example 2:

Input:
["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
[[[1,3]],[],[],[],[],[]]
Output: [null,0,1,1,1,0]

Explanation of Input Syntax:

The input is two lists: the subroutines called and their arguments. Solution’s constructor has one argument, the array w. pickIndex has no arguments. Arguments are always wrapped with a list, even if there aren’t any.

题目大意

这个题目不太好理解,是要求按照权重挑选索引。比如[1,99]中,有1%的概率挑选到索引0,有99%的概率挑选到索引1.

解题方法

这个题很巧妙,我是想不出来的。做法是把概率分布函数转化为累计概率分布函数。然后通过随机数,进行二分查找。

比如,输入是 [1,2,3,4] ,那么概率分布是 [1/10, 2/10, 3/10, 4/10],累积概率分布是[1/10, 3/10, 6/10, 10/10] . 总和是 10。如果我们产生一个随机数,在 1~10 之中,然后判断这个数字在哪个区间中就能得到对应的索引。

对于输入 [1,2,3,4],计算出来的 preSum 是 [1,3,6,10] ,然后随机选一个 s,然后查找 s 属于哪个区间,各区间的含义是:

区间:       [1], [2, 3], [4, 5, 6], [7, 8, 9, 10]
preSum:     1,  3,  6,  10
返回值:     1,  2,  3,  4

相当于找比 s 大的 preSum 值的索引。

如果还不理解,那么就想一想这个 preSum 的间隔,是不是发现这个间隔对应了题目的输入?那么选随机数找 upper_bound 的时候那就不是把一个区间里的数字合并到了某个 preSum 值上,而且 preSum 是不是对应着输入?所以是不是就把这个某个区间内的随机数对应上了一个输入值?

总之,随机的数字在哪个区间当中,那么就返回这个区间对应的数字即可。

这个二分查找也可以好好学习一下。

代码如下:

class Solution:def __init__(self, w):""":type w: List[int]"""self.preSum = [0] * len(w)self.preSum[0] = w[0]for i in range(1, len(w)):self.preSum[i] = self.preSum[i - 1] + w[i]def pickIndex(self):""":rtype: int"""total = self.preSum[-1]rand = random.randint(0, total - 1)left, right = 0, len(self.preSum) - 1while left + 1 < right:mid = (left + right) // 2if rand >= self.preSum[mid]:left = midelse:right = midif rand < self.preSum[left]:return leftreturn right# Your Solution object will be instantiated and called as such:
# obj = Solution(w)
# param_1 = obj.pickIndex()

日期

2018 年 8 月 18 日 —— 天在下雨

【LeetCode】528. Random Pick with Weight 解题报告(Python)相关推荐

  1. leetcode 528. Random Pick with Weight

    给一个权重的vector,让你根据权重的概率返回值,返回的值是这些权重的索引. 比如给你一个[1,2]的权重矩阵,1/3的概率返回0,2/3的概率返回1. 等概率函数random只能等概率的一系列数, ...

  2. LeetCode第45场双周赛-解题报告

    LeetCode第45场双周赛-解题报告 A. 唯一元素的和 原题链接 https://leetcode-cn.com/problems/sum-of-unique-elements/ 解题思路 因为 ...

  3. 【LeetCode】436. Find Right Interval 解题报告(Python)

    [LeetCode]436. Find Right Interval 解题报告(Python) 标签(空格分隔): LeetCode 作者: 负雪明烛 id: fuxuemingzhu 个人博客: h ...

  4. leetcode 398. Random Pick Index | 398. 随机数索引(Java)

    题目 https://leetcode.com/problems/random-pick-index/ 题解 常规思路,先用 map 存一串,取的时候从 map 对应的串中随机拿一个就 ok. cla ...

  5. python leetcode 398. Random Pick Index

    奇怪的是蓄水池抽样算法无法AC 代码2是蓄水池抽样 class Solution(object):import randomdef __init__(self, nums):""& ...

  6. leetcode 214. 最短回文串 解题报告

    给定一个字符串 s,你可以通过在字符串前面添加字符将其转换为回文串.找到并返回可以用这种方式转换的最短回文串. 示例 1: 输入: "aacecaaa" 输出: "aaa ...

  7. 【LeetCode】517. 超级洗衣机 解题报告 (python)

    原题地址:https://leetcode-cn.com/problems/super-washing-machines/submissions/ 题目描述: 假设有 n 台超级洗衣机放在同一排上.开 ...

  8. Leetcode 1190. Reverse Substrings Between Each Pair of Parentheses解题报告(python)

    1190. Reverse Substrings Between Each Pair of Parentheses Reverse Substrings Between Each Pair of Pa ...

  9. [leetcode] 273. Integer to English Words 解题报告

    题目链接:https://leetcode.com/problems/integer-to-english-words/ Convert a non-negative integer to its e ...

最新文章

  1. 【机器学习】机器学习Top10算法,教你选择最合适的那一个!一文读懂ML中的解析解与数值解...
  2. lcd参数解释及刷新率计算,LCD时序
  3. oracle星形转换,Oracle数据仓库博客(转,学)
  4. 【今晚7点半】:GVoice 千万在线语音传输的那些事
  5. python idle使用anaconda中库怎么用_如何使用Anaconda学习Python
  6. android收入管理系统,毕业设计(论文)-基于Android系统的家庭理财通软件的设计——收入管理模块.docx...
  7. Python多线程(自学必备 超详细)
  8. AIX 6.1 连接DS4700,多路径mpio,mpio_get_config -Av 需要打补丁。
  9. python hist2d_使用hist2d在matplotlib中创建一个对数线性图
  10. 《Adobe Photoshop CS4中文版经典教程》—第1课1.7节检查更新
  11. 零基础python入门-零基础 Python 入门
  12. Atitit. 状态模式(State)attilax 总结 跟个策 略模式的区别
  13. Windows 引导修复
  14. 羲云社区团购微信小程序多门店版,首页开发
  15. 035 浅谈WebGame
  16. 2019寒假专题一 L CodeForces - 1260B
  17. teensy 制作键盘 linux,kbfirmware使用教程——以制作小太刀TEX Kodachi键盘为例
  18. 嵌入式开发人员应该关心机器学习的 5 个理由
  19. Simulink---Extrinsic函数绘图
  20. 2023养老展,中福协养老展,中国国际养老服务业博览会

热门文章

  1. Git使用技巧大全和技巧
  2. 超详细的张飞硬件第七部开关电源读书笔记02
  3. 什么是云平台,云平台主要能干什么?
  4. 【翻页电子书制作软件】名编辑电子杂志大师教程 | 添加flash动画
  5. MySQL数据下载安装教程
  6. MTK5G模块芯片MTK6873_MT6873数据手册/datasheet/规格书
  7. 集成学习【二】:Adaboost结合神经网络及代码实现
  8. SQL Server 2008 R2 下载 iso
  9. matlab 卷积算子,matlab  矩阵卷积imfilter  conv2  filter 区别探究
  10. java业务逻辑_java业务逻辑怎么写?