import junit.framework.TestCase; import java.util.Arrays; public class LeetCode04_1 extends TestCase { /** * 566. 重塑矩阵 * 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。 * 给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。 * 重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。 * 如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。 * <p> * 示例 1: * 输入:mat = [[1,2],[3,4]], r = 1, c = 4 * 输出:[[1,2,3,4]] * <p> * 示例 2: * 输入:mat = [[1,2],[3,4]], r = 2, c = 4 * 输出:[[1,2],[3,4]] * <p> * 提示: * m == mat.length * n == mat[i].length * 1 <= m, n <= 100 * -1000 <= mat[i][j] <= 1000 * 1 <= r, c <= 300 */ /** * 将二维数组 nums 映射成一个一维数组;再将这个一维数组映射回 r 行 c 列的二维数组。 * 主要注意 res[][] 的下标问题。 * * 时间复杂度:O(rc)。这里的时间复杂度是在重塑矩阵成功的前提下的时间复杂度,否则当 mn !=rc 时, * C++ 语言中返回的是原数组的一份拷贝,本质上需要的时间复杂度为 O(mn),而其余语言可以直接返回原数组的对象,需要的时间复杂度仅为 O(1)。 * * 空间复杂度:O(1)。这里的空间复杂度不包含返回的重塑矩阵需要的空间。 * */ public int[][] matrixReshape(int[][] mat, int r, int c) { int m = mat.length; int n = mat[0].length; if (m * n != r * c) { return mat; } int[][] res = new int[r][c]; for (int i = 0; i < m * n; i++) { res[i / c][i % c] = mat[i / n][i % n]; } return res; } public void test() { int[][] mat = new int[][]{{1, 2}, {3, 4}}; System.out.println(Arrays.deepToString(matrixReshape(mat, 1, 4))); System.out.println(Arrays.deepToString(matrixReshape(mat, 2, 4))); } }
标签:输出,mat,示例,矩阵,566,重塑,LeetCode From: https://www.cnblogs.com/sueyyyy/p/16783079.html