java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846
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; }
}