(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表把数字和数字对应的下标管理起来

相关推荐
算AI8 小时前
人工智能+牙科:临床应用中的几个问题
人工智能·算法
hyshhhh10 小时前
【算法岗面试题】深度学习中如何防止过拟合?
网络·人工智能·深度学习·神经网络·算法·计算机视觉
杉之10 小时前
选择排序笔记
java·算法·排序算法
烂蜻蜓11 小时前
C 语言中的递归:概念、应用与实例解析
c语言·数据结构·算法
OYangxf11 小时前
图论----拓扑排序
算法·图论
我要昵称干什么11 小时前
基于S函数的simulink仿真
人工智能·算法
AndrewHZ11 小时前
【图像处理基石】什么是tone mapping?
图像处理·人工智能·算法·计算机视觉·hdr
念九_ysl11 小时前
基数排序算法解析与TypeScript实现
前端·算法·typescript·排序算法
守正出琦11 小时前
日期类的实现
数据结构·c++·算法
ChoSeitaku11 小时前
NO.63十六届蓝桥杯备战|基础算法-⼆分答案|木材加工|砍树|跳石头(C++)
c++·算法·蓝桥杯