528. 按权重随机选择

528. 按权重随机选择

给定一个正整数数组 w ,其中 w[i] 代表下标 i 的权重(下标从 0 开始),请写一个函数 pickIndex ,它可以随机地获取下标 i,选取下标 i 的概率与 w[i] 成正比。

例如,对于 w = [1, 3],挑选下标 0 的概率为 1 / (1 + 3) = 0.25 (即,25%),而选取下标 1 的概率为 3 / (1 + 3) = 0.75(即,75%)。

也就是说,选取下标 i 的概率为 w[i] / sum(w) 。

  • 示例 1:
输入:
["Solution","pickIndex"]
[[[1]],[]]
输出:
[null,0]
解释:
Solution solution = new Solution([1]);
solution.pickIndex(); // 返回 0,因为数组中只有一个元素,所以唯一的选择是返回下标 0。
  • 示例 2:
输入:
["Solution","pickIndex","pickIndex","pickIndex","pickIndex","pickIndex"]
[[[1,3]],[],[],[],[],[]]
输出:
[null,1,1,1,1,0]
解释:
Solution solution = new Solution([1, 3]);
solution.pickIndex(); // 返回 1,返回下标 1,返回该下标概率为 3/4 。
solution.pickIndex(); // 返回 1
solution.pickIndex(); // 返回 1
solution.pickIndex(); // 返回 1
solution.pickIndex(); // 返回 0,返回下标 0,返回该下标概率为 1/4 。由于这是一个随机问题,允许多个答案,因此下列输出都可以被认为是正确的:
[null,1,1,1,1,0]
[null,1,1,1,1,1]
[null,1,1,1,0,0]
[null,1,1,1,0,1]
[null,1,0,1,0,0]
......
诸若此类。

提示:

  • 1 <= w.length <= 10000
  • 1 <= w[i] <= 10^5
  • pickIndex 将被调用不超过 10000 次

解题思路

维护一个前缀和数组,里面的前缀和元素,就是每个区间的边界,因此我们随机生成一个[1,sum]之间的数字,再根据这个数字在前缀和数组中用二分查找搜索其位于的区间

代码

class Solution {int[] pre;int sum;public Solution(int[] w) {int n=w.length;pre=new int[n];pre[0]=w[0];for(int i=1;i<n;i++)pre[i]=pre[i-1]+w[i];sum=pre[n-1];}public int pickIndex() {int idx=(int)(Math.random()*sum)+1;return bs(idx);}public int bs(int tar) {int l=0,r=pre.length-1;while(l<r){int mid=(r-l)/2+l;if(pre[mid]<tar){l=mid+1;}else {r=mid;}}return l;}
}/*** Your Solution object will be instantiated and called as such:* Solution obj = new Solution(w);* int param_1 = obj.pickIndex();*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390186.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

sql语句语法多表关联_SQL创建表语句-带有示例语法

sql语句语法多表关联SQL is one of the most reliable and straightforward querying languages around. It provides clear cut syntax that reads easily without abstracting away too much of the functionalitys meaning.SQL是最可靠&#xff0c;最直接的查询语言之一。 它…

分布式改造剧集三:Ehcache分布式改造

第三集&#xff1a;分布式Ehcache缓存改造 前言 ​ 好久没有写博客了&#xff0c;大有半途而废的趋势。忙不是借口&#xff0c;这个好习惯还是要继续坚持。前面我承诺的第一期的DIY分布式&#xff0c;是时候上终篇了---DIY分布式缓存。 探索之路 ​ 在前面的文章中&#xff0c;…

85. 最大矩形

85. 最大矩形 给定一个仅包含 0 和 1 、大小为 rows x cols 的二维二进制矩阵&#xff0c;找出只包含 1 的最大矩形&#xff0c;并返回其面积。 示例 1&#xff1a; 输入&#xff1a;matrix [[“1”,“0”,“1”,“0”,“0”],[“1”,“0”,“1”,“1”,“1”],[“1”,“1”…

TP单字母函数

A方法 A方法用于在内部实例化控制器 调用格式&#xff1a;A(‘[项目://][分组/]模块’,’控制器层名称’) 最简单的用法&#xff1a; $User A(User); 表示实例化当前项目的UserAction控制器&#xff08;这个控制器对应的文件位于Lib/Action/UserAction.class.php&#xff09;…

Angular问题03 @angular/material版本问题

1 问题描述 应用使用 angular4在使用angular/material时&#xff0c;若果在导入模块时使用mat开头&#xff0c;就会报错。 2 问题原因 angular/material版本出现问题&#xff0c;angular/material 从版本5开始就必须要angular5的核心依赖&#xff1b;想要在angular5之前版本中的…

onclick判断组件调用_从子组件Onclick更新状态

onclick判断组件调用How to update the state of a parent component from a child component is one of the most commonly asked React questions.如何从子组件更新父组件的状态是最常见的React问题之一。 Imagine youre trying to write a simple recipe box application, …

Python 列表List的定义及操作

# 列表概念&#xff1a;有序的可变的元素集合# 定义 # 直接定义 nums [1,2,3,4,5]# 通过range函数构造&#xff0c;python2 和python3 版本之间的差异&#xff1b; # python3 用的时候才会去构造 nums range(1,101)# 列表嵌套 # 注意和C语言中数组的区别,是否可…

递归分解因数

题目总时间限制: 1000ms 内存限制: 65536kB描述给出一个正整数a&#xff0c;要求分解成若干个正整数的乘积&#xff0c;即a a1 * a2 * a3 * ... * an&#xff0c;并且1 < a1 < a2 < a3 < ... < an&#xff0c;问这样的分解的种数有多少。注意到a a也是一种分解…

剑指 Offer 51. 数组中的逆序对

剑指 Offer 51. 数组中的逆序对 在数组中的两个数字&#xff0c;如果前面一个数字大于后面的数字&#xff0c;则这两个数字组成一个逆序对。输入一个数组&#xff0c;求出这个数组中的逆序对的总数。 示例 1: 输入: [7,5,6,4] 输出: 5 限制&#xff1a; 0 < 数组长度 &…

react 图像识别_无法在React中基于URL查找图像

react 图像识别If youre new to React and are having trouble accessing images stored locally, youre not alone.如果您不熟悉React&#xff0c;并且无法访问本地存储的图像&#xff0c;那么您并不孤单。 Imagine you have your images stored in a directory next to a co…

html单行元素居中显示,多行元素居左显示

有很多的业务需要元素或者文字如果单行&#xff0c;居中显示&#xff0c;如果数据增多&#xff0c;居中显示代码&#xff08;直接复制到编辑器可用&#xff09;&#xff1a;<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8&q…

ML.NET 0.2版增加了集群和新示例

在今年的Build大会上&#xff0c;微软首次发布了ML.NET。ML.NET是开源的、跨平台的以及运行在.NET上的机器学习框架。微软的Ankit Asthana宣布该项目已经完成了第二版的开发。第二版增加了几个新功能&#xff0c;包括名为集群的新机器学习任务&#xff0c;交叉验证和训练-测试&…

如何变得井井有条-来之不易的秘诀来组织您的生活

Because of the changes brought about by COVID-19, many people have had to find healthy and productive ways of working remotely. 由于COVID-19带来的变化&#xff0c;许多人不得不寻找健康有效的远程工作方式。 Some have been sent home and can continue doing thei…

被未知进程占用端口的解决办法

echo off echo 这是用来结束一个未知进程占用端口的批处理可执行文件ipconfig /allnetstat -anoecho 请查看以上信息&#xff0c;输入被占用的端口号:set /p port请输入port:tasklist|findstr %port%echo 请结合上述程序进行输入&#xff0c;请**谨慎输入**set /p program请输入…

怎样在减少数据中心成本的同时不牺牲性能?

2019独角兽企业重金招聘Python工程师标准>>> 导读虽然组织对数据中心提出了更高的要求&#xff0c;但IT管理人员确实有办法在严格的预算内展开工作。如今&#xff0c;组织认为即使性能预期不断提高&#xff0c;其数据中心预算也在缩减。尽管2018年IT支出总体预计增长…

赛普拉斯 12864_如何使用赛普拉斯自动化辅助功能测试

赛普拉斯 12864In my previous post, I covered how to add screenshot testing in Cypress to ensure components dont unintentionally change over time. 在上一篇文章中 &#xff0c;我介绍了如何在赛普拉斯中添加屏幕截图测试&#xff0c;以确保组件不会随时间变化。 Now…

anaconda在win下和在mac下的安装区别

1. 在win下安装anaconda后会提示你选择环境变量&#xff0c;但是建议使用默认。 于是CMD进入终端和使用navigator进入终端不一样&#xff0c;前者会提示无此命令&#xff0c;只能通过navigator进入终端 即使在系统变量变量Path里添加了路径&#xff0c;使用CMD还是不能使用pyth…

fcn从头开始_如何使用Go从头开始构建区块链

fcn从头开始介绍 (Introduction) With Web 3.0 and blockchain becoming more mainstream every day, do you know what blockchain is? Do you know its technical advantages and use-cases?随着Web 3.0和区块链每天变得越来越主流&#xff0c;您知道什么是区块链吗&#x…

java实现无序数组结构

一、数组的2种定义方式 数据类型 [] 数组名称 new 数据类型[数组长度]; 这里 [] 可以放在数组名称的前面&#xff0c;也可以放在数组名称的后面&#xff0c;一般放在名称的前面 数据类型 [] 数组名称 {数组元素1&#xff0c;数组元素2&#xff0c;......} 这种方式声明数组的…

Android App 的主角:Activity

Android App 程序主要由4种类型组成&#xff1a; 1.Activity&#xff08;活动&#xff09;&#xff1a;主要负责屏幕显示画面&#xff0c;并处理与用户的互动。每个Android App至少都会有一个Activity&#xff0c;在程序一启动时显示主画面供用户操作。 2.Service&#xff08;后…