题目
398.随机数索引
题目大意
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
样例
示例:
int[] nums = new int[] {1,2,3,3,3};
Solution solution = new Solution(nums);
// pick(3) 应该返回索引 2,3 或者 4。每个索引的返回概率应该相等。
solution.pick(3);
// pick(1) 应该返回 0。因为只有nums[0]等于1。
solution.pick(1);
数据规模
无。
这题没有数据规模属实比较迷惑, 只告诉数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。到底有多大呢?能不能另开一个数组来存储数据呢?
结果标程还是用了一个数组来存,这题目数据给得就比较迷惑了,很不严谨。
思路
最简单的办法还是就考虑使用哈希表:定义unordered_map<int,vector<int> >vis
,对于每一类数值,用一个vector<int>
来存储下标:vis[nums[i]].push_back(i);
对于目标数target
,显然数组中有vis[target].size()
个target
,从中随机选取一个进行返回即可。
// short int long float double bool char string void
// array vector stack queue auto const operator
// class public private static friend extern
// sizeof new delete return cout cin memset malloc
// relloc size length memset malloc relloc size length
// for while if else switch case continue break system
// endl reverse sort swap substr begin end iterator
// namespace include define NULL nullptr exit equals
// index col row arr err left right ans res vec que sta
// state flag ch str max min default charray std
// maxn minn INT_MAX INT_MIN push_back insert
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int>PII;
typedef pair<int, string>PIS;
const int maxn=1e6+50;//注意修改大小
long long read(){long long x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-') f=-1;c=getchar();}while(isdigit(c)){x=x*10+c-'0';c=getchar();}return x*f;}
ll qpow(ll x,ll q,ll Mod){ll ans=1;while(q){if(q&1)ans=ans*x%Mod;q>>=1;x=(x*x)%Mod;}return ans%Mod;}
class Solution {
public:
unordered_map<int,vector<int> >vis;
Solution(vector<int>& nums) {
for(int i=0;i<nums.size();i++){
vis[nums[i]].push_back(i);
}
}
int pick(int target) {
int t=rand()%vis[target].size();
return vis[target][t];
}
};
/**
* Your Solution object will be instantiated and called as such:
* Solution* obj = new Solution(nums);
* int param_1 = obj->pick(target);
*/