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
}
相关推荐
LYFlied6 小时前
【每日算法】LeetCode142. 环形链表 II
数据结构·算法·leetcode·链表
超级大只老咪6 小时前
“和”与“或”逻辑判断与条件取反(Java)
java·算法
LYFlied6 小时前
【每日算法】LeetCode 23. 合并 K 个升序链表
前端·数据结构·算法·leetcode·链表
xiaoxue..6 小时前
LeetCode 第 15 题:三数之和
前端·javascript·算法·leetcode·面试
yaoh.wang6 小时前
力扣(LeetCode) 28: 找出字符串中第一个匹配项的下标 - 解法思
python·程序人生·算法·leetcode·面试·职场和发展·跳槽
flashlight_hi6 小时前
LeetCode 分类刷题:101. 对称二叉树
javascript·算法·leetcode
yaoh.wang7 小时前
力扣(LeetCode) 35: 搜索插入位置 - 解法思路
程序人生·算法·leetcode·面试·职场和发展·跳槽·二分搜索
唯唯qwe-7 小时前
Day20:贪心算法,跳跃游戏
python·算法·贪心算法
Fine姐7 小时前
数据结构05——平衡二叉树
数据结构
laocooon5238578867 小时前
背包问题~~!C++
开发语言·c++·算法