这是数组的第20篇算法,力扣链接。
在 MATLAB 中,有一个非常有用的函数
reshape
,它可以将一个m x n
矩阵重塑为另一个大小不同(r x c
)的新矩阵,但保留其原始数据。给你一个由二维数组
mat
表示的m x n
矩阵,以及两个正整数r
和c
,分别表示想要的重构的矩阵的行数和列数。重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
如果具有给定参数的
reshape
操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。示例 1:
输入:mat = [[1,2],[3,4]], r = 1, c = 4 输出:[[1,2,3,4]]
示例 2:
输入:mat = [[1,2],[3,4]], r = 2, c = 4 输出:[[1,2],[3,4]]
这道题的第一个思路是进行遍历赋值,遍历原数组的同时为新数组赋值,值得注意的是,这里的弹出条件是数组矩阵的面积不等。
Go
func matrixReshape(mat [][]int, r int, c int) [][]int {
height, weight := len(mat), len(mat[0])
if r == height && c == weight || height*weight != r*c {
return mat
}
result := make([][]int, r)
cr, cc := 0, 0
for _, row := range mat {
for _, col := range row {
if cc >= c {
cr++
cc %= c
}
if result[cr] == nil {
result[cr] = make([]int, c)
}
result[cr][cc] = col
cc++
}
}
return result
}
这个做法过于模拟,当然还有一些算法上的优化:
Go
func matrixReshape(nums [][]int, r int, c int) [][]int {
height, weight := len(nums), len(nums[0])
if height*weight != r*c {
return nums
}
result := make([][]int, r)
for i := range result {
result[i] = make([]int, c)
}
for i := 0; i < height*weight; i++ {
result[i/c][i%c] = nums[i/weight][i%weight]
}
return result
}