news 2026/10/19 7:19:36

DeepSeek LeetCode 384. 打乱数组 Java实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DeepSeek LeetCode 384. 打乱数组 Java实现

LeetCode 384. 打乱数组 Java 实现

这道题的核心是 Fisher–Yates 洗牌算法(也叫 Knuth 洗牌算法),它能保证 n! 种排列等概率出现。

关键点

  1. 保存原始数组的副本:reset() 要能恢复到初始状态,所以构造时必须克隆一份 original。
  2. 每次 shuffle 都在副本上操作:不能在 original 上直接打乱,否则下次 reset() 就失效了。
  3. Fisher–Yates 算法:从后往前遍历,对位置 i 随机选一个 [0, i] 范围内的 j,交换 arr[i] 和 arr[j]。

代码实现

classSolution{privateint[]original;// 保存初始数组privateRandomrandom;publicSolution(int[]nums){original=nums.clone();// 必须克隆,避免外部修改影响内部状态random=newRandom();}publicint[]reset(){returnoriginal.clone();// 返回副本,防止调用方修改内部数组}publicint[]shuffle(){int[]arr=original.clone();// 每次基于原始数组重新洗牌for(inti=arr.length-1;i>0;i--){intj=random.nextInt(i+1);// 生成 [0, i] 的随机下标inttemp=arr[i];arr[i]=arr[j];arr[j]=temp;}returnarr;}}

为什么这样是等概率的?

以 n = 3 为例,位置 2 有 3 种选择,位置 1 有 2 种选择,位置 0 只有 1 种选择,总共 3 × 2 × 1 = 3! = 6 种路径,每种路径对应一个唯一排列,且概率都是 1/6。推广到 n,每个排列的概率都是 1/n!,满足均匀分布。

常见错误

· ❌ 直接在 original 上打乱:会导致 reset() 无法恢复。
· ❌ 用「随机交换两个任意位置」的方式洗牌:当交换次数不固定或实现不当时,分布不均匀,某些排列出现概率更高。
· ❌ random.nextInt(i) 而不是 nextInt(i + 1):范围少一个,位置 i 永远无法与自己交换,虽然理论上仍可能均匀但会破坏算法结构的正确性推导(且 i = 0 时会抛异常)。

复杂度分析

操作 时间复杂度 空间复杂度
构造 Solution O(n) O(n)
reset() O(n) O(n)(返回的副本)
shuffle() O(n) O(n)(返回的副本)

如果允许直接返回内部数组(不要求防御性拷贝),reset 和 shuffle 的额外空间可以降到 O(1),但工程上返回副本更安全,也能避免评测系统拿到同一引用后互相干扰。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/19 7:18:38

《Attention Is All You Need》背景

2017 年谷歌发表论文《Attention Is All You Need》,当时并没有溅出一点水花,后来统治llm世界也是一段魔幻过程,我采集了下它的背后故事。 1. 差点没发出去 《Attention Is All You Need》的作者之一 Jakob Uszkoreit 后来在采访里说过&#…

作者头像 李华
网站建设 2026/10/19 7:17:57

【仿真】液冷板流道拓扑优化的思路与效果

摘要 液冷板流道设计本质上是压降与温差的权衡问题。本文从优化目标设定、拓扑优化算法选型、网格与求解器设置、多工况校核四个环节梳理液冷板流道拓扑优化的完整流程,并结合并联水道与串流道的对比说明优化收益的实际边界,可用于液冷板设计前期的方案…

作者头像 李华
网站建设 2026/10/19 7:15:26

图论开篇:DFS与回溯求解所有可达路径的完整指南

今天训练营走到第四十九天,正式开了图论这个大头。前面连续刷了十几天的动态规划,思路一下从“状态转移”切到“图的深搜”,说实话第一天有点被搞懵。不过今天这道卡码网 98 题《所有可达路径》属于图论里最典型、最值得反复吃透的入门题&…

作者头像 李华
网站建设 2026/10/19 7:15:22

Python aiida-optimade 包实战案例与常见错误

1. 引言aiida-optimade 是一个连接 AiiDA 数据库与 OPTIMADE 标准的 Python 插件包。它让材料科学研究者能够通过统一的 OPTIMADE REST API 接口,对外发布 AiiDA 中存储的晶体结构、计算任务和计算结果数据,同时也能让外部客户端通过标准查询语法检索这些…

作者头像 李华
网站建设 2026/10/19 7:14:30

基于STM32F103的嵌入式驱鸟装置设计与实现

简介:基于STM32F103的机场驱鸟装置是一份完整的嵌入式实战资源,面向学习STM32、舵机控制与超声波测距的开发者,可用于机场鸟情监测、智能驱赶等场景。系统利用超声波测距模块探测鸟类活动,由主控解析数据后控制舵机实时对准目标并…

作者头像 李华