原题链接:https://leetcode-cn.com/problems/random-pick-index/
题意:
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
方法:哈希表的简单应用
class Solution {
unordered_map<int,vector<int>> mp;//哈希表,存储映射关系<数字,出现在nums的下标>
public:
Solution(vector<int>& nums) {
int len = nums.size();//存储元素的个数
for(int i=0;i<len;i++)//更新哈希表
{
mp[nums[i]].emplace_back(i);
}
}
int pick(int target) {
return mp[target][rand()%mp[target].size()];//随即返回哈希表中key值为target的向量中的随机一个元素
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(nums);
* int param_1 = obj->pick(target);
*/
方法二:水塘抽样
class Solution {
vector<int> vec;//向量存向量nums
public:
Solution(vector<int>& nums) {
vec = nums;
}
int pick(int target) {
int cnt=0,ret;//计数器,要返回的数字
for(int i=0;i<vec.size();i++)//遍历每一个元素
{
if(vec[i]==target)//如果和目标值相等
{
cnt++;//计数器自加
if(rand()%cnt==0)//根据概率来刷新要返回的数字
ret = i;
}
}
return ret;
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(nums);
* int param_1 = obj->pick(target);
*/

本文介绍了两种解决LeetCode中随机选择数组中特定元素索引的方法,包括使用哈希表和水塘抽样。哈希表方法通过建立数字到其索引的映射关系,实现快速随机选取;水塘抽样则通过对数组遍历,按概率随机返回目标值的索引。这两种方法都针对大规模数组设计,避免了额外空间的大量使用。
1403

被折叠的 条评论
为什么被折叠?



