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
}
相关推荐
go54631584657 分钟前
在本地环境中运行 ‘dom-distiller‘ GitHub 库的完整指南
人工智能·深度学习·神经网络·算法·矩阵·github
weixin_5375904530 分钟前
【任务6.13】计算肇事汽车号码
c++·算法·汽车
从今天开始学习Verilog38 分钟前
FFT算法实现之fft IP核
算法·fpga开发
荼蘼2 小时前
基于 KNN 算法的手写数字识别项目实践
人工智能·算法·机器学习
Yuroo zhou2 小时前
IMU的精度对无人机姿态控制意味着什么?
单片机·嵌入式硬件·算法·无人机·嵌入式实时数据库
jackzhuoa2 小时前
java小白闯关记第一天(两个数相加)
java·算法·蓝桥杯·期末
Codeking__3 小时前
链表算法综合——重排链表
网络·算法·链表
minji...4 小时前
数据结构 堆(4)---TOP-K问题
java·数据结构·算法
AI_Keymaker5 小时前
一句话生成3D世界:腾讯开源混元3D模型
算法
Leon_vibs5 小时前
当 think 遇上 tool:深入解析 Agent 的规划之道
算法