1. 法一,下标填充
代码:时间复杂度O(r*c).除题目要求外,算法本身没有需要额外空间,空间复杂度O(1) |
---|
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int matR = mat.length,matC = mat[0].length;
if(r*c != matR*matC) return mat;
int[][] ans = new int[r][c];
int ansI = 0, ansJ = 0;
for(int i = 0;i<matR;i++){
for(int j = 0;j<matC;j++){
ans[ansI][ansJ] = mat[i][j];
if(ansJ==c-1){
ansI++;
ansJ = 0;
}else ansJ++;
}
}
return ans;
}
}
2. 法二:数学除法和取余
- 从0开始算,一个3列n行矩阵中,每行就有3个元素,我们从头开始数,第15个元素,在第几行?当然是15/3=5
- 知道是第5行,那么在第5行的第几列呢?当然是让它15%3 = 0; 也就是放在第0个位置,也就是[5][0]位置
- 如果我们将其放到4列n行矩阵中,每行有4个元素,从头开始算,第15个元素在第几行?当然是15/4 = 3
- 第几列呢?15%4 = 3. 也就是[3][3]位置
代码:时间复杂度O(r*c).除题目要求外,算法本身没有需要额外空间,空间复杂度O(1) |
---|
class Solution {
public int[][] matrixReshape(int[][] mat, int r, int c) {
int matR = mat.length,matC = mat[0].length;
if(r*c != matR*matC) return mat;
int[][] ans = new int[r][c];
for(int i = 0; i< matR*matC;i++) ans[i/c][i%c] = mat[i/matC][i%matC];
return ans;
}
}