首页 > 其他分享 >LeetCode|384. 打乱数组(day22)

LeetCode|384. 打乱数组(day22)

时间:2024-10-25 22:49:10浏览次数:10  
标签:nums res 打乱 day22 算法 384 随机 数组 LeetCode

作者:MJ昊

博客:掘金CSDN

公众号:程序猿的编程之路

今天是 昊 的算法之路第22天,今天分享的是LeetCode第384题打乱数组的解题思路。这是一道中等难度的题目,要求我们实现一个算法,使得数组支持随机打乱重置为初始顺序的功能,并且每种排列出现的概率应当相等。

题目描述简要回顾

LeetCode 第 384 题要求我们实现一个算法,使给定的数组支持随机打乱和重置为初始顺序的功能。打乱操作需要保证每个排列出现的概率是均等的。

解题思路

我们可以通过Fisher-Yates洗牌算法 实现打乱操作。这种算法从后向前遍历数组,每次随机选择一个位置并交换元素,确保所有排列出现的概率相等。重置操作则是直接返回初始数组。

代码实现:

var Solution = function (nums) {
    this.nums = [...nums]; // 存储原始数组
};

Solution.prototype.reset = function () {
    return this.nums; // 返回原始数组
};

Solution.prototype.shuffle = function () {
    const res = [...this.nums]; // 创建数组副本
    for (let i = res.length - 1; i > 0; i--) {
        const j = Math.floor(Math.random() * (i + 1)); // 在 [0, i] 范围内随机选择
        [res[i], res[j]] = [res[j], res[i]]; // 交换元素
    }
    return res;
};

复杂度分析

  • 时间复杂度:
    • reset():O(1),直接返回原始数组。
    • shuffle():O(n),需要遍历数组进行元素交换。
  • 空间复杂度:
    O(n),由于存储了数组副本。

总结

这道题考察了如何实现洗牌算法,并且要求保证洗牌后每种排列出现的概率均等。通过 Fisher-Yates 算法 ,我们可以在 O(n) 时间内完成打乱操作,满足题目要求。
这种算法在实际开发中非常常用,比如在实现随机抽样、随机排序等功能时。

标签:nums,res,打乱,day22,算法,384,随机,数组,LeetCode
From: https://blog.csdn.net/Hao_i/article/details/143219643

相关文章

  • LeetCode|910. 最小差值 II(day19)
    作者:MJ昊博客:掘金、CSDN等公众号:程序猿的编程之路今天是昊的算法之路第19天,今天分享的是LeetCode第910题最小差值II的解题思路。这是一道中等难度的题目,考察如何通过调整数组中的数值来最小化最大值与最小值之间的差距。题目描述简要回顾给定一个整数数组nums和......
  • 2024-10-23-leetcode每日一题-构成整天的下标对数目 II
    题目描述给你一个整数数组 hours,表示以 小时 为单位的时间,返回一个整数,表示满足 i<j 且 hours[i]+hours[j] 构成 整天 的下标对 i, j 的数目。整天 定义为时间持续时间是24小时的 整数倍 。例如,1天是24小时,2天是48小时,3天是72小时,以此类推。......
  • LeetCode_70. 爬楼梯_java
    1、题目70.爬楼梯https://leetcode.cn/problems/climbing-stairs/假设你正在爬楼梯。需要n阶你才能到达楼顶。每次你可以爬1或2个台阶。你有多少种不同的方法可以爬到楼顶呢?示例1:输入:n=2输出:2解释:有两种方法可以爬到楼顶。1.1阶+1阶2.2阶示例2:输......
  • LeetCode_509. 斐波那契数_java
    1、题目509.斐波那契数https://leetcode.cn/problems/fibonacci-number/斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n)=F(n-1)+F(n-2),其中n>1给定n,请......
  • LeetCode_2119. 反转两次的数字_java
    1、题目2119.反转两次的数字https://leetcode.cn/problems/a-number-after-a-double-reversal/反转一个整数意味着倒置它的所有位。   例如,反转2021得到1202。反转12300得到321,不保留前导零。给你一个整数num,反转num得到reversed1,接着反转reversed1......
  • leetcode-1280-学生参加各科测试的次数
    链接:1280.学生们参加各科测试的次数-力扣(LeetCode)前提条件:学生表: Students+---------------+---------+|ColumnName|Type|+---------------+---------+|student_id|int||student_name|varchar|+---------------+---------+在SQL中,主......
  • 【每日一题】LeetCode - 最长回文子串
    在字符串相关的算法题中,寻找最长回文子串是一个经典且富有挑战性的题目。本篇将详细分析并推导两种有效的解决方案:动态规划法和中心扩展法。题目描述给定一个字符串s,我们需要找到s中最长的回文子串。回文是指正着读和反着读都相同的字符串。例如,输入"babad"时,输出可......
  • 【leetcode-面试经典 150 题】-4.删除有序数组中的重复项 II
    题目:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使得出现次数超过两次的元素只出现两次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用O(1)额外空间的条件下完成。示例1:输入:nums=[1,1,1,2,2,3]输出:5,nums=......
  • 【leetcode-面试经典 150 题】-1.合并两个有序数组
    题目:给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 ......
  • LeetCode常用算法模板
    代码模板  1、DFS:适用于树和图的遍历、组合问题。2、BFS:适用于树和图的层次遍历、最短路径问题。3、二分查找:适用于有序数组的搜索问题。4、动态规划:适用于最优化问题、序列问题。5、贪心算法:适用于局部最优问题、调度问题。6、回溯算法:适用于组合、排列、子集问题。......