深入解析 LeetCode 1470:重新排列数组
引用
在算法刷题的实践中,数组的重排问题是考察对元素索引规律和遍历策略理解的经典题型。LeetCode 1470 题“重新排列数组”就是这类问题的典型代表,它要求我们根据特定的元素分组规律,将数组重新排列为指定的格式,既考察了对数组结构的分析能力,也考验了遍历与元素赋值的代码实现技巧。
一、问题概述
1.1 问题描述
LeetCode 1470 题要求我们处理一个长度为 2n 的数组 nums,该数组初始格式为 [x₁,x₂,...,xₙ,y₁,y₂,...,yₙ],需要将其重新排列为 [x₁,y₁,x₂,y₂,...,xₙ,yₙ] 的格式并返回重排后的数组。
1.2 示例解析
· 示例 1:
输入 nums = [2,5,1,3,4,7],n = 3。其中 x₁=2, x₂=5, x₃=1,y₁=3, y₂=4, y₃=7,重排后数组为 [2,3,5,4,1,7]。
· 示例 2:
输入 nums = [1,2,3,4,4,3,2,1],n = 4。重排后数组为 [1,4,2,3,3,2,4,1]。
· 示例 3:
输入 nums = [1,1,2,2],n = 2。重排后数组为 [1,2,1,2]。
二、解题思路
2.1 核心规律分析
观察数组的重排要求,我们可以发现以下关键规律:
· 原数组的前 n 个元素是 x 组(x₁ 到 xₙ),后 n 个元素是 y 组(y₁ 到 yₙ)。
· 重排后的数组需要按照“x₁,y₁,x₂,y₂,...,xₙ,yₙ”的顺序排列,即第 i 个 x 元素(下标 i,0 ≤ i < n)需要和第 i 个 y 元素(下标 n + i)交替放置。
2.2 遍历与赋值策略
基于上述规律,我们可以采用一次遍历,交替赋值的策略:
· 初始化一个长度为 2n 的结果数组 arr。
· 遍历 x 组的每个元素下标 index(从 0 到 n·1),在结果数组中依次放置 nums[index](x 元素)和 nums[index + n](y 元素)。
三、代码实现与逐句解析
3.1 完整代码
```java
![]()
class Solution {public int[] shuffle(int[] nums, int n) {int[] arr = new int[2 * n];int index = 0;for (int i = 0; i < 2 * n; i += 2) {arr[i] = nums[index];arr[i + 1] = nums[index + n];index++;}return arr;}}```
3.2 代码逐句解析
· int[] arr = new int[2 * n];:创建一个长度为 2n 的结果数组,用于存储重排后的元素。
· int index = 0;:初始化 x 组元素的下标指针 index,从 0 开始遍历 x 组。
· for (int i = 0; i < 2 * n; i += 2):遍历结果数组的下标,每次递增 2,因为每次需要放置一个 x 元素和一个 y 元素。
· arr[i] = nums[index];:将当前 x 组的元素(nums[index])放置到结果数组的第 i 位。
· arr[i + 1] = nums[index + n];:将对应的 y 组元素(nums[index + n])放置到结果数组的第 i+1 位。
· index++;:x 组的下标指针后移,准备处理下一个 x 元素。
· return arr;:返回重排后的结果数组。
四、复杂度分析
4.1 时间复杂度
算法的时间复杂度为 O(n),其中 n 是 x 组(或 y 组)的元素数量。我们只需遍历 x 组的 n 个元素,每个元素的赋值操作是 O(1),因此总时间复杂度与数组规模线性相关。
4.2 空间复杂度
算法的空间复杂度为 O(n),主要是用于存储结果数组的空间(长度为 2n,属于 O(n) 级别)。
五、边界情况与测试用例分析
5.1 边界情况
· n = 1:此时数组长度为 2,重排后格式为 [x₁,y₁],如输入 [a,b] 输出 [a,b]。
· n = 500:达到题目中 n 的最大值限制,算法仍能在 O(500) 时间内完成,性能优异。
5.2 测试用例验证
· 示例 1 验证:
输入 nums = [2,5,1,3,4,7],n = 3。遍历过程:
· index = 0:arr[0] = 2,arr[1] = 3(nums[0+3] = nums[3] = 3)。
· index = 1:arr[2] = 5,arr[3] = 4(nums[1+3] = nums[4] = 4)。
· index = 2:arr[4] = 1,arr[5] = 7(nums[2+3] = nums[5] = 7)。
最终数组 [2,3,5,4,1,7],与示例输出一致。
· 示例 2 验证:
输入 nums = [1,2,3,4,4,3,2,1],n = 4。遍历过程:
· index = 0:arr[0] = 1,arr[1] = 4(nums[0+4] = nums[4] = 4)。
· index = 1:arr[2] = 2,arr[3] = 3(nums[1+4] = nums[5] = 3)。
· index = 2:arr[4] = 3,arr[5] = 2(nums[2+4] = nums[6] = 2)。
· index = 3:arr[6] = 4,arr[7] = 1(nums[3+4] = nums[7] = 1)。
最终数组 [1,4,2,3,3,2,4,1],与示例输出一致。
· 示例 3 验证:
输入 nums = [1,1,2,2],n = 2。遍历过程:
· index = 0:arr[0] = 1,arr[1] = 2(nums[0+2] = nums[2] = 2)。
· index = 1:arr[2] = 1,arr[3] = 2(nums[1+2] = nums[3] = 2)。
最终数组 [1,2,1,2],与示例输出一致。
六、算法思想拓展与应用场景
6.1 算法思想拓展
本题的“交替赋值”思路可推广至其他数组重排或元素分组问题,例如:
· 将两个等长数组合并为“交叉排列”的形式(如 [a1,a2] 和 [b1,b2] 合并为 [a1,b1,a2,b2])。
· 对数组按特定索引规律进行元素重排(如根据奇偶下标、区间分组等规律)。
6.2 应用场景
该算法可应用于以下实际场景:
· 数据预处理:在某些机器学习任务中,需要将特征数组和标签数组按“特征·标签”的顺序交叉排列,以便后续按批次处理。
· 前端交互:处理用户输入的成对数据(如“问题·答案”“选项·分值”),按交叉格式展示或存储。
· 游戏开发:对游戏中的资源数组(如“道具·数量”)进行交叉重排,便于资源的批量加载与管理。
七、总结
LeetCode 1470 题“重新排列数组”通过交替赋值的一次遍历策略,高效地解决了数组的重排需求。其核心在于识别 x 组和 y 组元素的索引规律,通过一次遍历同时处理两个组的元素,将时间复杂度优化至 O(n),空间复杂度优化至 O(n)。
这道题的解题过程体现了“规律识别→策略设计→代码实现”的完整思维链路。掌握这种针对数组结构的分析与操作能力,不仅能解决本题,还能迁移到各类数组重排、元素分组的算法问题中,为实际开发中的数据处理场景提供高效的解决方案。
