1. 题目
给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。
注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。
示例:
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);
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/random-pick-index
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2. 蓄水池抽样
类似题目:LeetCode 519. 随机翻转矩阵(哈希)
- 遇到 target,计数+1,然后用 计数分之1的概率去替换之前找到的 target 的下标
class Solution {vector<int> arr;int i, idx, count;bool Occur;
public:Solution(vector<int>& nums) {arr = nums;}int pick(int target) {Occur = false;count = 0;for(i = 0; i < arr.size(); ++i){if(arr[i] == target){if(!Occur){idx = i;Occur = true;count = 1;}else{count++;if(rand()%count == 0)//有 1/count 的概率等于0idx = i;}}}return idx;}
};