(leetcode算法题)384. 打乱数组 398. 随机数索引

问题转化:

题目要求将nums中的数字出现的次序随机打乱

转化成:对于 0 号位置来说,nums[i], ..., nums[n - 1] 可以等概率的出现 ... && ...

&& 对于 n - 1号位置来说,nums[i], ..., nums[n - 1] 可以等概率的出现

转化成:每个位置从nums[i], ..., nums[n - 1]中不放回重复抽样,

对于每个位置来说,随机抽取一个数字之后,后面的抽取不再考虑这个数字

那么这个题就是不放回抽样的的典型例子,

需要注意的就是没有当前被抽到的数字要全部放到数组的后面

代码如下

cpp 复制代码
class Solution {
private:
    vector<int> _nums;
public:
    Solution(vector<int>& nums) {
        // srand(nullptr);
        _nums = nums;
    }
    
    vector<int> reset() {
        return _nums;
    }
    
    vector<int> shuffle() {
        vector<int> snums(_nums);
        int n = snums.size();
        for(int i = 0; i < n; ++i){
// 抽样不放回,每次则每个数放到i位置的概率为 1 / n
            swap(snums[i], snums[i + rand() % (n - i)]);
        }
        return snums;
    }
};

/**
 * Your Solution object will be instantiated and called as such:
 * Solution* obj = new Solution(nums);
 * vector<int> param_1 = obj->reset();
 * vector<int> param_2 = obj->shuffle();
 */

这个题的测试用例对损耗内存的要求不是非常严格,但是对效率的要求很高

应该使用hash表把数字和数字对应的下标管理起来

相关推荐
圣保罗的大教堂18 分钟前
leetcode 2274. 不含特殊楼层的最大连续楼层数 中等
leetcode
fadtes1 小时前
C++ extern(八股总结)
开发语言·c++·算法
xiaoshiguang31 小时前
LeetCode:236. 二叉树的最近公共祖先
java·算法·leetcode
Smark.1 小时前
(leetcode算法题)面试题 17.19. 消失的两个数字
算法·leetcode
Octopus20772 小时前
链地址法(哈希桶)
c++·笔记·学习·算法·哈希算法
Cedric_Anik2 小时前
数据结构——二叉树
数据结构·算法
❦丿多像灬笑话、℡2 小时前
leetcode 热题100(32. 最长有效括号)栈 c++
java·c++·leetcode
KeyPan2 小时前
【数据结构与算法:八、排序】
开发语言·数据结构·人工智能·后端·算法·排序算法·scala
看星猩的柴狗2 小时前
密码学原理技术-第十一章-Hash Functions
算法·密码学·哈希算法