LeetCode/solutions/398. Random Pick Index.md
2019-12-19 16:20:22 +08:00

1.0 KiB
Raw Blame History

398. Random Pick Index

思路

给定一个包含重复数字的数组和一个target要求随机返回一个target在数组中的下标。 题目指明我们不能用太多的空间那我们可以考虑蓄水池采样Reservoir Sampling算法这个算法我已经在382题解中详细说过了, 这里不再赘述,直接给出代码。

pick时间复杂度O(n)空间复杂度O(1)

C++

class Solution {
private:
    vector<int>::iterator begin;
    int size;
public:
    Solution(vector<int>& nums) {
        begin = nums.begin();
        size = nums.size();
    }
    
    int pick(int target) {
        int res = -1, count = 1;
        
        for(int i = 0; i < size; i++){
            if(*(begin+i) != target) continue;
            if(rand() % count == 0) res = i;
            count++;
        }
        return res;
    }
};