jaryue
2023/04/27阅读:13主题:默认主题
leetcode 566. 重塑矩阵
题目描述
-
重塑矩阵
在 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]]
提示:
m == mat.length n == mat[i].length 1 <= m, n <= 100 -1000 <= mat[i][j] <= 1000 1 <= r, c <= 300
解题思路
法1
方法1:模拟补位+双指针\
新构数组差的数字的个数与当前数组的剩余数组的个数的对比
比如
35-->53
新数组第一排第一次差5个,而旧数组第一排只剩3个,全部加上去(用append函数来实现),i++旧数组使用第二排的数据来填充,,j=0复位
第二排新数组差两个数据,(第一次加了三个),而旧数组有三个,只需要用到两个,所以加两个上去,j=j+2,指针向后移动,k=k+1新数组指针移向下一排
一直循环执行,直到完全赋值上去为止,输出数组
-
时间复杂度(O(n)) -
空间复杂度(O(n))
执行结果
法1
func matrixReshape(mat [][]int, r int, c int) [][]int {
l1, l2 := len(mat), len(mat[0])
if l1*l2 != r*c {
return mat
}
result := make([][]int, r)
for i, j, k := 0, 0, 0; i < l1 && k < r; {
if len(mat[i][j:]) <= c-len(result[k]) {
result[k] = append(result[k], mat[i][j:]...)
i++
j = 0
} else if len(mat[i][j:]) > c-len(result[k]) {
t := c - len(result[k])
result[k] = append(result[k], mat[i][j:j+c-len(result[k])]...)
j += t
k++
}
}
return result
}
执行结果: 通过 显示详情 查看示例代码 添加备注
执行用时: 8 ms , 在所有 Go 提交中击败了 90.22% 的用户 内存消耗: 6.2 MB , 在所有 Go 提交中击败了 29.33% 的用户 通过测试用例: 57 / 57 炫耀一下:
作者介绍