当前位置: 首页 > article >正文

【C++刷题】力扣-#566-重塑矩阵

题目描述

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的行遍历顺序填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例

示例 1

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

示例 2

输入:nums = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]
限制条件:
● 1 <= m, n, r, c <= 100
● m * n == r * c

题解

这个问题可以通过将原始矩阵展平为一维数组,然后再重新塑形为新的行和列数。

  1. 展平矩阵:遍历原始矩阵,将所有元素放入一个一维数组中。
  2. 重塑矩阵:根据新的行数 r 和列数 c,重新塑形一维数组为新的二维矩阵。

代码实现

vector<vector<int>> matrixReshape(vector<vector<int>>& mat, int r, int c) {
    int m = mat.size(), n = mat[0].size(); // 获取原始矩阵的行数和列数
    int total = m * n;                     // 计算总元素数量
    if (total != r * c) {                  // 检查重塑操作是否合理
        return mat; // 如果不合理,返回原始矩阵
    }

    vector<int> flatNums(total); // 创建一个一维数组来存储所有元素
    int k = 0;
    for (const auto& row : mat) {
        for (int num : row) {
            flatNums[k++] = num;
        }
    }

    vector<vector<int>> reshaped(r, vector<int>(c)); // 创建新的矩阵
    for (int i = 0; i < total; ++i) {
        reshaped[i / c][i % c] = flatNums[i]; // 填充新的矩阵
    }
    return reshaped;
}

复杂度分析

● 时间复杂度:O(m * n),其中 m 和 n 分别是原始矩阵的行数和列数。我们需要遍历原始矩阵的所有元素。
● 空间复杂度:O(m * n),用于存储展平后的一维数组。
这个算法的优势在于它直接使用简单的遍历和数组操作来重塑矩阵,而不需要复杂的数学计算。


http://www.kler.cn/a/377789.html

相关文章:

  • ant design 学习记录 type PrefixType = keyof typeof MOCK_DATA;
  • DDoS防护中的流量清洗与智能调度
  • Python爬虫(入门+进阶)
  • Vivado常用IP例化2
  • Unity 6 中的新增功能
  • HW护网分析研判思路,流量告警分析技巧
  • 前端八股文第四篇
  • WorkFlow源码剖析——Communicator之TCPServer(上)
  • Linux:编辑器Vim和Makefile
  • ResTful风格的Url
  • Mac如何实现高效且干净的卸载应用程序
  • Gateway解说
  • 目标追踪DeepSort
  • network HCIE认证
  • 一文带你深入理解Rust 中的 Trait 一致性(Coherence)
  • SparkSQL整合Hive后,如何启动hiveserver2服务
  • Spring Boot框架下的水电管理系统开发
  • leetcode-21-合并两个有序链表
  • mac电脑设置crontab定时任务,以及遇到的问题解决办法
  • 【力扣专题栏】两数之和,两种解法实现该题。
  • python数据类型-8-数据结构-Queue (队列)
  • leetcode3. Longest Substring Without Repeating Characters
  • 获取Hive表备注
  • nodejs入门教程16:nodejs res
  • 基于MATLAB多参数结合火焰识别系统
  • 【系统面试篇】进程和线程类(1)(笔记)——区别、通讯方式、同步、互斥、死锁