🚩传送门:https://leetcode-cn.com/problems/reshape-the-matrix/

🍗鸡腿知识点:

  1. 数组下标的映射公式

🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图1

  1. 一步转换原因:

🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图2 👉 一维 x 做中间值 👈 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图3 image.png

题目

在 MATLAB 中,有一个非常有用的函数 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图5 ,它可以将一个 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图6 矩阵重塑为另一个大小不同(🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图7)的新矩阵,但保留其原始数据。给你一个由二维数组 mat 表示的 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图8 矩阵,以及两个正整数 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图9🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图10 ,分别表示想要的重构的矩阵的 行数列数 。重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。如果具有给定参数的 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图11 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:
🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图12

输入:mat = [[1,2],[3,4]], r = 1, c = 4 输出:[[1,2,3,4]]

示例 2:
🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图13

输入:mat = [[1,2],[3,4]], r = 2, c = 4 输出:[[1,2],[3,4]]

解题思路:二维数组的一维表示

对于一个行数为 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图14 ,列数为 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图15 ,行列下标都从 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图16 开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图17 映射到整数域内,并且它们按照行优先的顺序一一对应着 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图18 中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。如果读者对机器学习有一定了解,可以知道这就是 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图19 操作。

这样的映射即为:🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图20

同样地,我们可以将整数 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图21 映射回其在矩阵中的下标,即

🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图22

其中 / 表示整数除法,% 表示取模运算。

那么对于题目需要我们做的事情相当于:

  1. 将二维数组 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图23 映射成一个一维数组;
  2. 将这个一维数组映射回 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图24🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图25 列的二维数组。

当然可以直接用一个一维数组进行过渡,但也可以直接从二维数组 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图26 得到 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图27🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图28 列的重塑矩阵:

  1. 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图29 本身为 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图30🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图31 列,如果 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图32,那么二者包含的元素个数不相同,因此无法进行重塑;
  2. 对于 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图33,第 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图34 个元素在 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图35 中对应的下标为 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图36,而在新的重塑矩阵中对应的下标为 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图37。我们直接进行赋值即可。

复杂度分析

时间复杂度:🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图38

这里的时间复杂度是在重塑矩阵成功的前提下的时间复杂度,否则当 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图39 时,C++ 语言中返回的是原数组的一份拷贝,本质上需要的时间复杂度为🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图40,而其余语言可以直接返回原数组的对象,需要的时间复杂度仅为 🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图41

空间复杂度:🍗[LeetCode]Ar566. 重塑矩阵 【矩阵和一维数组下标映射关系】 - 图42

这里的空间复杂度不包含返回的重塑矩阵需要的空间。

官方代码

  1. class Solution {
  2. public int[][] matrixReshape(int[][] nums, int r, int c) {
  3. //1.行数
  4. int m = nums.length;
  5. //2.列数
  6. int n = nums[0].length;
  7. //3.能否转换判断
  8. if (m * n != r * c) {
  9. return nums;
  10. }
  11. int[][] ans = new int[r][c];
  12. //4.下标映射
  13. for (int x = 0; x < m * n; ++x) {
  14. ans[x / c][x % c] = nums[x / n][x % n];
  15. }
  16. return ans;
  17. }
  18. }