LeetCode384之打乱数组(相关话题:随机算法,洗牌算法)
题目描述
给你一个整数数组 nums ,设计算法来打乱一个没有重复元素的数组。
实现 Solution class:
Solution(int[] nums) 使用整数数组 nums 初始化对象
int[] reset() 重设数组到它的初始状态并返回
int[] shuffle() 返回数组随机打乱后的结果
示例:
输入[1, 2, 3]
输出 [3, 1, 2],
解释
Solution solution = new Solution([1, 2, 3]);
solution.shuffle(); // 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。例如,返回 [3, 1, 2]
solution.reset(); // 重设数组到它的初始状态 [1, 2, 3] 。返回 [1, 2, 3]
solution.shuffle(); // 随机返回数组 [1, 2, 3] 打乱后的结果。例如,返回 [1, 3, 2]
解法一
暴力算法简单的来说就是把每个数放在一个 ”帽子“ 里面,每次从 ”帽子“ 里面随机摸一个数出来,直到 “帽子” 为空。下面是具体操作,首先我们把数组 array 复制一份给数组 aux,之后每次随机从 aux 中取一个数,为了防止数被重复取出,每次取完就把这个数从 aux 中移除。重置 的实现方式很简单,只需把 array 恢复称最开始的状态就可以了。
这个算法的正确性在于,每次 for 循环中,任何一个元素都会以等可能的概率被选中。为了证明这一点,我们可以算出来,一个特定的元素 e 在第 k 轮被选中的概率为 P(e 在第 k 轮被选中) * P(e 在前 k 轮不被选中)。假设洗牌的数组有 n个元素,这个概率公式如下所
相关文章
- 【LeetCode-面试算法经典-Java实现】【033-Search in Rotated Sorted Array(在旋转数组中搜索)】
- 算法手撕代码36~45
- 利用EM算法进行小波域隐马尔科夫模型的参数训练
- C#,字符串匹配算法(模式搜索)Z算法的源代码与数据可视化
- C#,初学琼林(05)——二分法查找(binary search,二分法搜索)数组内指定值的算法与源代码
- 数组的几种排序算法的实现
- Unity 实现A* 寻路算法
- knn算法的c语言实现
- 集成剪枝分类算法的Adaboost集成学习算法示例
- 蓝桥杯《算法很美》第4章:数组与矩阵
- 剑指offer解法汇总85-连续子数组的最大和(二) 算法知识视频讲解
- 最短路 HDU - 2544 (dijkstra算法或Floyd算法)
- 【最短路算法】Dijkstra+heap和SPFA的区别
- 密码学系列之:加密货币中的scrypt算法
- 数据结构 | 串的模式匹配 KMP算法 next数组
- 时序数据库TSDB逐日统计的Jave算法实现过程
- 116、【回溯算法】leetcode ——17. 电话号码的字母组合:回溯法:哈希映射+字符串数组映射(C++版本)
- 整型数组处理算法(十三)请实现一个函数:凑14。[风林火山]
- 华为OD机试 - 数组编写函数(JavaScript) | 机试题+算法思路+考点+代码解析 【2023】
- 华为OD机试 -合规数组(Java) | 机试题+算法思路+考点+代码解析 【2023】
- 蓝桥杯 之 算法训练 排序
- 【源代码】将一个整数的每位数分解并按逆序放入一个数组中(用递归算法)(C语言实现)
- js 数组 去重 算法(转载)
- 高性能图像放大算法——hqx算法
- leetcode算法88.合并两个有序数组
- leetcode算法67.二进制求和
- leetcode算法53.最大子数组和