LeetCode 1470. Shuffle the Array
题目描述
给你一个数组 nums,数组中有 2n 个元素,按 [x1, x2, ..., xn, y1, y2, ..., yn] 的格式排列。请你将数组按 [x1, y1, x2, y2, ..., xn, yn] 格式重新排列,返回重排后的数组。
示例 1:
1 | 输入:nums = [2,5,1,3,4,7], n = 3 |
示例 2:
1 | 输入:nums = [1,2,3,4,4,3,2,1], n = 4 |
解题思路
题目要求将数组从”前半部分 x + 后半部分 y”的排列方式转换为”交叉排列”的方式。换句话说,原数组的前 n 个元素是 x 组,后 n 个元素是 y 组,我们需要逐一交叉取出。
分析步骤:
- 数组长度为
2n,前n个元素nums[0]到nums[n-1]对应x1到xn。 - 后
n个元素nums[n]到nums[2n-1]对应y1到yn。 - 目标顺序为:
x1, y1, x2, y2, ..., xn, yn—— 即每次取一个x,再取一个对应的y。
算法通过循环实现:
- 遍历索引
i从0到n-1; - 每次迭代中,先将
nums[i](即x_{i+1})追加到结果列表; - 再将
nums[n + i](即y_{i+1})追加到结果列表; - 循环结束后,结果列表恰好包含
2n个元素,且顺序符合要求。
这种逐个追加的方式直观易懂,每个元素被访问恰好一次,结果列表的顺序自然形成交叉排列。
复杂度分析
- 时间复杂度:
O(n),其中n为参数中给定的n(数组长度的一半)。循环执行n次,每次进行两次append操作,总共2n次操作,与数组长度成正比。 - 空间复杂度:
O(n),需要一个长度为2n的结果列表res来存储重排后的数组(不计返回值)。
代码
1 | from typing import List |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 𝒞𝒶𝓃𝒶𝓇𝓎!