20-数组-重塑矩阵

这是数组的第20篇算法,力扣链接

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 rc ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。

如果具有给定参数的 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
}
相关推荐
I_LPL1 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
颜酱1 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073212 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
2401_831824963 小时前
代码性能剖析工具
开发语言·c++·算法
Sunshine for you4 小时前
C++中的职责链模式实战
开发语言·c++·算法
qq_416018724 小时前
C++中的状态模式
开发语言·c++·算法
2401_884563244 小时前
模板代码生成工具
开发语言·c++·算法
2401_831920744 小时前
C++代码国际化支持
开发语言·c++·算法
m0_672703314 小时前
上机练习第51天
数据结构·c++·算法
ArturiaZ4 小时前
【day60】
算法·深度优先·图论