j

jaryue

V1

2023/04/27阅读:13主题:默认主题

leetcode 566. 重塑矩阵

leetcode 566. 重塑矩阵


题目描述

  1. 重塑矩阵

在 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 := 000; 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 炫耀一下:

分类:

后端

标签:

后端

作者介绍

j
jaryue
V1