我们当然可以直接使用一个一维数组进行过渡,但我们也可以直接从二维数组 nums 得到 r 行 c 列的重塑矩阵:
设 nums 本身为 m 行 n 列,如果 mn \neq rc,那么二者包含的元素个数不相同,因此无法进行重塑;
否则,对于 x \in [0, mn),第 x 个元素在 nums 中对应的下标为 (x / n, x% n),而在新的重塑矩阵中对应的下标为 (x / c, x% c)。我们直接进行赋值即可。
代码
[sol1-C++]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
classSolution { public: vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) { int m = nums.size(); int n = nums[0].size(); if (m * n != r * c) { return nums; }
vector<vector<int>> ans(r, vector<int>(c)); for (int x = 0; x < m * n; ++x) { ans[x / c][x % c] = nums[x / n][x % n]; } return ans; } };
[sol1-Java]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution { publicint[][] matrixReshape(int[][] nums, int r, int c) { intm= nums.length; intn= nums[0].length; if (m * n != r * c) { return nums; }
int[][] ans = newint[r][c]; for (intx=0; x < m * n; ++x) { ans[x / c][x % c] = nums[x / n][x % n]; } return ans; } }
[sol1-Python3]
1 2 3 4 5 6 7 8 9 10 11
classSolution: defmatrixReshape(self, nums: List[List[int]], r: int, c: int) -> List[List[int]]: m, n = len(nums), len(nums[0]) if m * n != r * c: return nums ans = [[0] * c for _ inrange(r)] for x inrange(m * n): ans[x // c][x % c] = nums[x // n][x % n] return ans
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13
var matrixReshape = function(nums, r, c) { const m = nums.length; const n = nums[0].length; if (m * n != r * c) { return nums; }
const ans = newArray(r).fill(0).map(() =>newArray(c).fill(0)); for (let x = 0; x < m * n; ++x) { ans[Math.floor(x / c)][x % c] = nums[Math.floor(x / n)][x % n]; } return ans; };
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14
funcmatrixReshape(nums [][]int, r int, c int) [][]int { n, m := len(nums), len(nums[0]) if n*m != r*c { return nums } ans := make([][]int, r) for i := range ans { ans[i] = make([]int, c) } for i := 0; i < n*m; i++ { ans[i/c][i%c] = nums[i/m][i%m] } return ans }
int** matrixReshape(int** nums, int numsSize, int* numsColSize, int r, int c, int* returnSize, int** returnColumnSizes) { int m = numsSize; int n = numsColSize[0]; if (m * n != r * c) { *returnSize = numsSize; *returnColumnSizes = numsColSize; return nums; } *returnSize = r; *returnColumnSizes = malloc(sizeof(int) * r); int** ans = malloc(sizeof(int*) * r);
for (int i = 0; i < r; i++) { (*returnColumnSizes)[i] = c; ans[i] = malloc(sizeof(int) * c); } for (int x = 0; x < m * n; ++x) { ans[x / c][x % c] = nums[x / n][x % n]; } return ans; }