[Leetcode] 398. Random Pick Index 解题报告

来源:互联网 发布:大数据的统计学基础 编辑:程序博客网 时间:2024/06/08 12:26

题目

Given an array of integers with possible duplicates, randomly output the index of a given target number. You can assume that the given target number must exist in the array.

Note:
The array size can be very large. Solution that uses too much extra space will not pass the judge.

Example:

int[] nums = new int[] {1,2,3,3,3};Solution solution = new Solution(nums);// pick(3) should return either index 2, 3, or 4 randomly. Each index should have equal probability of returning.solution.pick(3);// pick(1) should return 0. Since in the array only nums[0] is equal to 1.solution.pick(1);

思路

对于大数据而言水池采样是神器:我们遍历数组的时候,如果发现了新的target,则让它以一定的概率转移到该索引上。有兴趣的读者可以参考水池采样的问题描述及正确性证明:https://en.wikipedia.org/wiki/Reservoir_sampling。该算法的时间复杂度是O(n),其中n是数组的长度;空间复杂度是O(1)。

代码

class Solution {public:    Solution(vector<int> nums) {        vec = nums;    }        int pick(int target) {        int ans = 0, cnt = 1;        for(int i = 0; i < vec.size(); ++i) {              if(vec[i] == target && rand() % (cnt++) == 0) {                ans = i;            }        }        return ans;      }private:    vector<int> vec;};/** * Your Solution object will be instantiated and called as such: * Solution obj = new Solution(nums); * int param_1 = obj.pick(target); */

原创粉丝点击