| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 【Leetcode】398. 随机数索引 -> 正文阅读 |
|
[数据结构与算法]【Leetcode】398. 随机数索引 |
题目链接:随机数索引 题目描述: 给你一个可能含有 重复元素 的整数数组 nums ,请你随机输出给定的目标数字 target 的索引。你可以假设给定的数字一定存在于数组中。 实现 Solution 类: Solution(int[] nums) 用数组 nums 初始化对象。 方法一: 1)初始化时,将nums赋值给另一个数组;时间O(1) 2)pick时,对数组进行遍历,使用reduce方法存储下所有和target相等的元素的索引,在得到的数组中使用Math.random()随机选择一个元素。时间O(n),空间O(n)。 总时间O(mn),m为pick次数,n为nums数组元素个数。空间O(n),借助另一个数组。 js代码如下:
方法二:哈希表 1)在初始化的时候,将nums中的元素都存入一个哈希表中,key元素值,value是一个数组,保存着相等元素值的所有索引。时间O(n),空间O(n) 2)pick时,直接从哈希表中取出对应数组,使用Math.random()取值即可。时间O(1)。 总时间O(n),空间O(n)。 js代码如下:
方法三:水塘取样 当nums的长度n确定时,其中的样本个数k也确定。从k个样本中随机选择一个,并且保证k个样本中每个样本被选中的概率都是1/k,直接使用Math.floor(Math.random()*k)即可。 但当数据量很大,nums的长度n不确定时,其中的样本个数k也不确定。就不能直接用上述公式,因为k是未知的。 但是,若共i个数据,每个数据被选择的概率都是1/i,不被选择的概率都是1-1/i, 那么k个样本中,最终样本i被选中的概率=第i个样本被选中的概率1/i * 第i+1个样本不被选中的概率1-1/(1+i),,,*第k个样本不被选中的概率1-1/k, 化简得到P(i 被选中)=1/k,即每个样本被选中的概率都是1/k。这样是符合题目要求的。 显然,最终结论满足的充要条件是,当共i个数据时,每个数据被选中的概率是1/i,不被选中的概率是1-1/i。这一条件可以通过Math.floor(Math.random()*i)来实现。 由Math.floor(Math.random()*i),可以得知[0,i)区间中每个数据被选中的概率都是1/i, Math.floor(Math.random()*i)==0的概率为1/i Math.floor(Math.random()*i)!=0的概率为1-1/i。 所以可以对每一个样本i,判断Math.floor(Math.random()*i)==0,若相等,概率为1/i,说明可以选中样本i,且概率为1/i。若不相等,概率为1-1/i,则说明i不能被选中。 最终留下的样本i的概率为1/i,其后面k-i个样本没被选中的概率都是1-1/(i+1),,,1-1/k 得到最后选择样本i的概率为:P(i被选中,i+1到k都没被选中)=1/i*i/(i+1)*(i+1)/(i+2)...*(k-1)/k=1/k。 js代码如下:
用cnt来统计样本数量,当某个元素i是样本时,就判断Math.floor(Math.random()*cnt)==0,若相等,说明该样本可以被选中。不相等,说明不能。ans存储被选中的最后一个样本即可。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 6:49:11- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |