一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情。
题目描述
在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。
示例
输入: mat = [[1,2],[3,4]], r = 1, c = 4
输出: [[1,2,3,4]]
输入: mat = [[1,2],[3,4]], r = 2, c = 4
输出: [[1,2],[3,4]]
提示
m == mat.lengthn == mat[i].length1 <= m, n <= 100-1000 <= mat[i][j] <= 10001 <= r, c <= 300
普通遍历
步骤:
- 边界判断
- 定义结果数组,定义行,列两个指针变量
- 遍历原数组,将元素赋值到新数组中
class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
// 边界判断
int m = nums.length, n = nums[0].length;
if((r * c) != (m * n)){
return nums;
}
int[][] res = new int[r][c];
int row = 0, col = -1;
for(int[] num : nums){
for(int n : num){
// 判断当前行是否抵达边界
if(col + 1 == c){
++row;
col = 0;
}else{
++col;
}
res[row][col] = n;
}
}
return res;
}
}
精简
步骤:
- 边界判断
- 定义结果数组
- 遍历原数组,通过除法跟取余所得得差异来获取行,列的索引位置
class Solution {
public int[][] matrixReshape(int[][] nums, int r, int c) {
int m = nums.length, n = nums[0].length;
if((r * c) != (m * n)){
return nums;
}
int[][] res = new int[r][c];
for(int i = 0; i < m * n; ++i){
// 通过除法跟取余所得得差异来获取行,列的索引位置
res[i / c][i % c] = nums[i / n][i % n];
}
return res;
}
}