Easy
题目描述
给你一个下标从 0 开始的一维整数数组 original 和两个整数 m 和 n。你需要使用 original 中的所有元素创建一个 m 行 n 列的二维数组。
original 中下标从 0 到 n - 1(都包含)的元素构成二维数组的第一行,下标从 n 到 2 * n - 1(都包含)的元素构成二维数组的第二行,依此类推。
请你根据上述过程返回一个 m x n 的二维数组。如果无法构成这样的二维数组,请你返回一个空的二维数组。
示例 1:
输入:original = [1,2,3,4], m = 2, n = 2
输出:[[1,2],[3,4]]
解释:构造出的二维数组应该包含 2 行 2 列。
original 中第一个 n=2 的部分为 [1,2] ,构成二维数组的第一行。
original 中第二个 n=2 的部分为 [3,4] ,构成二维数组的第二行。
示例 2:
输入:original = [1,2,3], m = 1, n = 3
输出:[[1,2,3]]
解释:构造出的二维数组应该包含 1 行 3 列。
将 original 中所有三个元素放入二维数组的第一行。
示例 3:
输入:original = [1,2], m = 1, n = 1
输出:[]
解释:original 中有 2 个元素。
无法将 2 个元素放入到一个 1x1 的二维数组中,所以返回一个空的二维数组。
提示:
1 <= original.length <= 5 * 10^41 <= original[i] <= 10^51 <= m, n <= 4 * 10^4
解题思路
这是一道模拟类的简单题目,核心思路是判断能否将一维数组完美转换为指定大小的二维数组。
解题思路:
可行性判断:首先需要判断转换是否可能。只有当
m * n == original.length时,才能将一维数组完美转换为m行n列的二维数组。如果元素个数不匹配,直接返回空数组。构建二维数组:如果可以转换,我们需要按照题目要求将一维数组的元素依次填入二维数组中。具体做法是:
- 创建一个
m行n列的二维数组 - 使用一个索引
idx遍历原数组 - 外层循环控制行数(0 到 m-1),内层循环控制列数(0 到 n-1)
- 将
original[idx]赋值给result[i][j],然后idx递增
- 创建一个
优化思路:也可以使用数学计算的方式,对于位置
(i, j),对应的一维数组索引为i * n + j。
这种方法时间复杂度是 O(m×n),空间复杂度是 O(1)(不计算结果数组的空间)。
代码实现
class Solution {
public:
vector<vector<int>> construct2DArray(vector<int>& original, int m, int n) {
if (m * n != original.size()) {
return {};
}
vector<vector<int>> result(m, vector<int>(n));
int idx = 0;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
result[i][j] = original[idx++];
}
}
return result;
}
};
class Solution:
def construct2DArray(self, original: List[int], m: int, n: int) -> List[List[int]]:
if m * n != len(original):
return []
result = []
idx = 0
for i in range(m):
row = []
for j in range(n):
row.append(original[idx])
idx += 1
result.append(row)
return result
public class Solution {
public int[][] Construct2DArray(int[] original, int m, int n) {
if (m * n != original.Length) {
return new int[0][];
}
int[][] result = new int[m][];
int idx = 0;
for (int i = 0; i < m; i++) {
result[i] = new int[n];
for (int j = 0; j < n; j++) {
result[i][j] = original[idx++];
}
}
return result;
}
}
var construct2DArray = function(original, m, n) {
if (m * n !== original.length) {
return [];
}
const result = [];
let idx = 0;
for (let i = 0; i < m; i++) {
const row = [];
for (let j = 0; j < n; j++) {
row.push(original[idx++]);
}
result.push(row);
}
return result;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(m × n) | 需要遍历所有 m×n 个位置来构建二维数组 |
| 空间复杂度 | O(1) | 不计算结果数组的话,只使用常数级别的额外空间 |
相关题目
- . Reshape the Matrix (Easy)