LeetCode 528. 按权重随机选择

2023-10-31 13:32

本文主要是介绍LeetCode 528. 按权重随机选择,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

力扣icon-default.png?t=M3K6https://leetcode-cn.com/problems/random-pick-with-weight/

【分析】如果直接用水塘取样的话会超时,因为查询次数为10^4,每次查询时需要枚举10^4长度的数组,而Random.nextInt()中的参数可以达到10^9。

class Solution {Random random = new Random();int[] w;int[] p;int n;public Solution(int[] w) {this.w = w;this.n = w.length;p = new int[n];p[0] = w[0];for(var i = 1; i < n; i++) p[i] = p[i - 1] + w[i];}public int pickIndex() {int ans = 0;for(var i = 0; i < n; i++){if(random.nextInt(p[i]) < w[i]) ans = i;}return ans;}
}

【方法二 前缀和+枚举】把概率值求前缀和,然后生成一个概率综合范围内的随机数r,查找到第一个>r的前坠值,也就把概率用区间长度来表示了,看随机数落在哪个区间内。

class Solution {int[] w;int n;public Solution(int[] w) {this.w = w;n = w.length;for(var i = 1; i < n; ++i){w[i] += w[i - 1];}}public int pickIndex() {double random = Math.random() * w[n - 1];for(var i = 0; i < n; ++i){if(w[i] > random) return i;}return n - 1;}
}

【优化 前缀和+二分查找】我们发现前缀和事一个排好序的数组,我们要查找大于目标r的最小值,所以这个查询过程可以用二分来实现。

class Solution {int[] w;int n;Random random = new Random();public Solution(int[] w) {this.w = w;n = w.length;for(var i = 1; i < n; ++i){w[i] += w[i - 1];}}public int BinarySearch(int left, int right, double target){int mid;while(left <= right){mid = (left + right) / 2;if(w[mid] <= target) left = mid + 1;else right = mid - 1;}return left;}public int pickIndex() {double r = random.nextInt(w[n - 1]);return BinarySearch(0, n - 1, r);}
}

 

 

 

 

这篇关于LeetCode 528. 按权重随机选择的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/315707

相关文章

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Python 中 requests 与 aiohttp 在实际项目中的选择策略详解

《Python中requests与aiohttp在实际项目中的选择策略详解》本文主要介绍了Python爬虫开发中常用的两个库requests和aiohttp的使用方法及其区别,通过实际项目案... 目录一、requests 库二、aiohttp 库三、requests 和 aiohttp 的比较四、requ

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

哈希leetcode-1

目录 1前言 2.例题  2.1两数之和 2.2判断是否互为字符重排 2.3存在重复元素1 2.4存在重复元素2 2.5字母异位词分组 1前言 哈希表主要是适合于快速查找某个元素(O(1)) 当我们要频繁的查找某个元素,第一哈希表O(1),第二,二分O(log n) 一般可以分为语言自带的容器哈希和用数组模拟的简易哈希。 最简单的比如数组模拟字符存储,只要开26个c

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个?

跨平台系列 cross-plateform 跨平台应用程序-01-概览 cross-plateform 跨平台应用程序-02-有哪些主流技术栈? cross-plateform 跨平台应用程序-03-如果只选择一个框架,应该选择哪一个? cross-plateform 跨平台应用程序-04-React Native 介绍 cross-plateform 跨平台应用程序-05-Flutte

leetcode-24Swap Nodes in Pairs

带头结点。 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode(int x) { val = x; }* }*/public class Solution {public ListNode swapPairs(L