写在前面
📖本篇内容:Leetcode每日一题398. 随机数索引
📑 文章专栏:leetcode每日一题《打卡日常》
⭐算法仓库:小🐏的变强之路
昨天断更是因为题太难了,不会,今天这题难度就很奈斯。
题目
给你一个可能含有 重复元素 的整数数组 nums ,请你随机输出给定的目标数字 target 的索引。你可以假设给定的数字一定存在于数组中。
实现 Solution 类:
Solution(int[] nums) 用数组 nums 初始化对象。 int pick(int target) 从 nums
中选出一个满足 nums[i] == target 的随机索引 i 。如果存在多个有效的索引,则每个索引的返回概率应当相等。
示例:
输入
[“Solution”, “pick”, “pick”, “pick”]
[[[1, 2, 3, 3, 3]], [3], [1], [3]]
输出
[null, 4, 0, 2]解释 Solution solution = new Solution([1, 2, 3, 3, 3]);
solution.pick(3); // 随机返回索引 2, 3 或者 4 之一。每个索引的返回概率应该相等。
solution.pick(1); // 返回 0 。因为只有 nums[0] 等于 1 。
solution.pick(3); //随机返回索引 2, 3 或者 4 之一。每个索引的返回概率应该相等。
提示:
1 <= nums.length <= 2 * 104
-231 <= nums[i] <= 231 - 1
target 是 nums 中的一个整数
最多调用 pick 函数 104 次
📝思路📝
哈希表
如果不考虑数组的大小,我们可以在构造函数中,用一个哈希表 pos 记录 nums 中相同元素的下标。
对于 pick 操作,我们可以从 pos 中取出 target
对应的下标列表,然后随机选择其中一个下标并返回。
⭐代码实现⭐
class Solution {
unordered_map<int, vector<int>> pos;
public:
Solution(vector<int> &nums) {
for (int i = 0; i < nums.size(); ++i) {
pos[nums[i]].push_back(i);
}
}
int pick(int target) {
auto &indices = pos[target];
return indices[rand() % indices.size()];
}
};
复杂度分析
时间复杂度:初始化为 O(n), pick 为 O(1),其中 nn 是 nums 的长度。
空间复杂度:O(1),我们需要 O(n) 的空间存储 n 个下标。
写在最后
觉得本篇文章不错的话记得点赞👍,收藏⭐,还有问题也可以评论留言💬
你的支持将是我继续创作的最大动力❤️❤️❤️
由于作者水平有限,如有错误和不准确之处在所难免,本人也很想知道这些错误,恳望读者批评指正!