力扣-566. 重塑矩阵

1. 题目

题目地址(566. 重塑矩阵 - 力扣(LeetCode))

https://leetcode.cn/problems/reshape-the-matrix/

题目描述

在 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]]

 

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 100
  • -1000 <= mat[i][j] <= 1000
  • 1 <= r, c <= 300

2. 题解

2.1 模拟

思路

这里就是完全模拟题意的操作,我在这里使用的双循环(记录原数组的行数和列数)比较麻烦,还要加上中途判断
参考了一下题解, 发现只用一重循环(记录元素总个数), 配合 除法 和 求余 操作即可表示出原数组和新数组的对应行数和列数

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
        int row = mat.size(), col = mat[0].size();
        if(row * col != r * c) return mat;
        vector<vector<int>> ans(r, vector<int>(c));
        int x = 0, y = 0;
        // for(int i = 0; i < row; i++){
        //     for(int j = 0; j < col; j++){
        //         ans[x][y] = mat[i][j];
        //         y++;
        //         if(y >= c){
        //             y %= c;
        //             x++;
        //         }
        //     }
        // }

        for(int x = 0; x < row * col; x++){
            ans[x / c][x % c] = mat[x / col][x % col];
        }
        return ans;
    }
};

复杂度分析

令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)
posted @ 2024-04-28 08:31  DawnTraveler  阅读(5)  评论(0编辑  收藏  举报