Easy

题目描述

给你一个下标从 0 开始的一维整数数组 original 和两个整数 mn。你需要使用 original 中的所有元素创建一个 mn 列的二维数组。

original 中下标从 0n - 1(都包含)的元素构成二维数组的第一行,下标从 n2 * 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^4
  • 1 <= original[i] <= 10^5
  • 1 <= m, n <= 4 * 10^4

解题思路

这是一道模拟类的简单题目,核心思路是判断能否将一维数组完美转换为指定大小的二维数组。

解题思路:

  1. 可行性判断:首先需要判断转换是否可能。只有当 m * n == original.length 时,才能将一维数组完美转换为 mn 列的二维数组。如果元素个数不匹配,直接返回空数组。

  2. 构建二维数组:如果可以转换,我们需要按照题目要求将一维数组的元素依次填入二维数组中。具体做法是:

    • 创建一个 mn 列的二维数组
    • 使用一个索引 idx 遍历原数组
    • 外层循环控制行数(0 到 m-1),内层循环控制列数(0 到 n-1)
    • original[idx] 赋值给 result[i][j],然后 idx 递增
  3. 优化思路:也可以使用数学计算的方式,对于位置 (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)不计算结果数组的话,只使用常数级别的额外空间

相关题目