将一维数组转换成二维数组
将一维数组转换成二维数组
解法一:常规解法
使用双循环
class Solution {
public int[][] construct2DArray(int[] original, int m, int n) {
int len = original.length;
int index = 0;
int[][] result = new int[m][n];
if(len != m * n) return new int[0][0];
for (int i = 0; i < m; i++) {
for(int j = 0; j < n; j++){
result[i][j]=original[index++]
}
}
return result;
}
}
时间复杂度为 O(m*n),空间复杂度 O(1)
解法二
class Solution {
public int[][] construct2DArray(int[] original, int m, int n) {
if (original.length != m * n) {
return new int[0][0];
}
int[][] result = new int[m][n];
for (int i = 0; i < original.length; i++) {
result[i / n][i % n] = original[i];
}
return result;
}
}
时间复杂度为 O(m*n),空间复杂度 O(1)
索引映射原理
- 行号:
row = i / n(整数除法)
因为每行有n个元素,前n个元素(i = 0 ~ n-1)属于第 0 行;接下来n个元素(i = n ~ 2n-1)属于第 1 行,以此类推。 - 列号:
col = i % n(取余运算)
每一行内,列号从0到n-1循环。
解法三:力扣官方题解
class Solution {
public int[][] construct2DArray(int[] original, int m, int n) {
// 1. 长度校验:总元素个数必须等于 m * n
if (original.length != m * n) {
return new int[0][]; // 返回一个空的二维数组(0行,列数未指定)
}
// 2. 创建目标二维数组,所有元素初始为 0
int[][] ans = new int[m][n];
// 3. 循环复制每一行
for (int i = 0; i < original.length; i += n) {
// 将 original 中从索引 i 开始的 n 个元素,复制到 ans 的第 (i/n) 行,从第 0 列开始
System.arraycopy(original, i, ans[i / n], 0, n);
}
// 4. 返回构造好的二维数组
return ans;
}
}
循环步长: i += n
- 因为每行有
n个元素,所以每次跳过一整行的数据,i的取值依次为:0, n, 2n, ..., (m-1)*n。 - 循环次数正好为
m行。
System.arraycopy :高效复制
System.arraycopy(original, i, ans[i / n], 0, n);
- 参数含义:
original:源数组。i:源数组起始位置(当前行的第一个元素在原数组中的索引)。ans[i / n]:目标数组的那一行(ans的第i/n行,因为i/n正好是行号)。0:目标行的起始列(列 0)。n:要复制的元素个数(即每行的列数)。
链接:https://leetcode.cn/problems/convert-1d-array-into-2d-array/solutions/1185411/jiang-yi-wei-shu-zu-zhuan-bian-cheng-er-zt47o/
来源:力扣(LeetCode)
浙公网安备 33010602011771号