leetcode398. 随机数索引

本文介绍了两种解决LeetCode中随机选择数组中特定元素索引的方法,包括使用哈希表和水塘抽样。哈希表方法通过建立数字到其索引的映射关系,实现快速随机选取;水塘抽样则通过对数组遍历,按概率随机返回目标值的索引。这两种方法都针对大规模数组设计,避免了额外空间的大量使用。

原题链接:https://leetcode-cn.com/problems/random-pick-index/

题意:

给定一个可能含有重复元素的整数数组,要求随机输出给定的数字的索引。 您可以假设给定的数字一定存在于数组中。

注意:
数组大小可能非常大。 使用太多额外空间的解决方案将不会通过测试。

方法:哈希表的简单应用 

class Solution {
    unordered_map<int,vector<int>> mp;//哈希表,存储映射关系<数字,出现在nums的下标>
public:
    Solution(vector<int>& nums) {
        int len = nums.size();//存储元素的个数
        for(int i=0;i<len;i++)//更新哈希表
        {
            mp[nums[i]].emplace_back(i);
        }
    }
    
    int pick(int target) {
        return mp[target][rand()%mp[target].size()];//随即返回哈希表中key值为target的向量中的随机一个元素
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * int param_1 = obj->pick(target);
 */

 方法二:水塘抽样

class Solution {
    vector<int> vec;//向量存向量nums
public:
    Solution(vector<int>& nums) {
        vec = nums;
    }
    
    int pick(int target) {
        int cnt=0,ret;//计数器,要返回的数字
        for(int i=0;i<vec.size();i++)//遍历每一个元素
        {
            if(vec[i]==target)//如果和目标值相等
            {
                cnt++;//计数器自加
                if(rand()%cnt==0)//根据概率来刷新要返回的数字
                    ret = i;
            }
        }
        return ret;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * int param_1 = obj->pick(target);
 */

 

【事件触发一致性】研究多智能体网络如何通过分布式事件驱动控制实现有限时间内的共识(Matlab代码实现)内容概要:本文围绕多智能体网络中的事件触发一致性问题,研究如何通过分布式事件驱动控制实现有限时间内的共识,并提供了相应的Matlab代码实现方案。文中探讨了事件触发机制在降低通信负担、提升系统效率方面的优势,重点分析了多智能体系统在有限时间收敛的一致性控制策略,涉及系统模型构建、触发条件设计、稳定性与收敛性分析等核心技术环节。此外,文档还展示了该技术在航空航天、电力系统、机器人协同、无人机编队等多个前沿领域的潜在应用,体现了其跨学科的研究价值和工程实用性。; 适合人群:具备一定控制理论基础和Matlab编程能力的研究生、科研人员及从事自动化、智能系统、多智能体协同控制等相关领域的工程技术人员。; 使用场景及目标:①用于理解和实现多智能体系统在有限时间内达成一致的分布式控制方法;②为事件触发控制、分布式优化、协同控制等课题提供算法设计与仿真验证的技术参考;③支撑科研项目开发、学术论文复现及工程原型系统搭建; 阅读建议:建议结合文中提供的Matlab代码进行实践操作,重点关注事件触发条件的设计逻辑与系统收敛性证明之间的关系,同时可延伸至其他应用场景进行二次开发与性能优化。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值