栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【04-25】力扣每日一题

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【04-25】力扣每日一题

本文首发于馆主君晓的博客,04-25每日一题

题目描述

  话不多说,先放题目链接和题目截图,398.随机数索引,题目如下图所示:

题目分析

  一般人看到这道题的思路就是使用哈希表去做,首先建立一个哈希表,表的key是数组里的元素,表的value是每个元素在数组中的下标数组。那么在pick函数里,首先根据元素的值在哈希表中获取其的下标数组,然后根据下标数组的长度生成随机数,根据随机数取出我们需要的下标。

  当然如果学过水塘抽样的算法的话,那么这道题可以用抽样的思路去做。题目里有这样的一个限制,那就是对于重复的数字,我们随机返回其索引。那么对于水塘抽样的话,我们的思路可以是这样,假设在数组中,我们的target数有k个,那么我们可以这样做,首先遍历数组,当遍历的第i个target的时候,我们生成[0,i)的随机数,如果随机数等于0,那么我们就记录i为我们需要返回的索引。这个我们也可以使用数学证明一下,思路如下:(如果这块还没理解,我们待会儿看看代码就理解了)

代码实现

  对于使用哈希表的思路,我们的代码如下,使用c++实现

class Solution {
    unordered_map> pos;
public:
    Solution(vector &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()];
    }
};

  对于使用水塘抽样的思路,我们的代码如下,使用c++实现:

class Solution {
    vector& nums;
public:
    Solution(vector& nums):nums(nums){
        
    }
    
    int pick(int target) {
        int ans = 0;
        for(int i = 0,count = 0;i 
结语 

  每天进步一点点,offer就近一点点

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/835282.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号