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

( 数组和矩阵) 566. 重塑矩阵 ——【Leetcode每日一题】

❓566. 重塑矩阵

难度:简单

在 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

💡思路:

可以设置一个索引index,记录从原矩阵取的第几个数,这个数是可以映射到原矩阵的位置,从而可以取出原矩阵对应位置的数字:
{ r =  index  / n c =  index  % n \left\{\begin{array}{l}\mathrm{r}=\text { index } / \mathrm{n} \\\mathrm{c}=\text { index } \% \mathrm{n}\end{array}\right. {r= index /nc= index %n

🍁代码:(Java、C++)
Java

class Solution {
    public int[][] matrixReshape(int[][] mat, int r, int c) {
        int m = mat.length, n = mat[0].length;
        if(m * n != r * c) return mat;
        int[][] ans = new int[r][c];
        int index = 0;
        for(int i = 0; i < r; i++){
            for(int j = 0; j < c; j++){
                ans[i][j] = mat[index / n][index % n];
                index++;
            }
        }
        return ans;
    }
}

C++

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

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( r c ) O(rc) O(rc),里的时间复杂度是在重塑矩阵成功的前提下的时间复杂度。
  • 空间复杂度 O ( 1 ) O(1) O(1),这里的空间复杂度不包含返回的重塑矩阵需要的空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我 leetCode专栏,每日更新!

注: 如有不足,欢迎指正!


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

相关文章:

  • Llama微调测试记录
  • C 语言 【模拟实现内存库函数】
  • 阿里云centos7.9服务器磁盘挂载,切换服务路径
  • Java面向对象高级2
  • 【HarmonyOS NEXT】一次开发多端部署(以轮播图、Tab栏、列表为例,配合栅格布局与媒体查询,进行 UI 的一多开发)
  • golang如何实现sse
  • osg::Drawable类通过setDrawCallback函数设置回调函数的说明
  • 构建ChatGPT 镜像,并将其部署到 Docker 容器中。
  • 基于Matlab刻度盘识别角度计算
  • C++:计算机操作系统:多线程:高并发中的线程
  • ViveNAS - 一个基于LSM tree的文件存储实现 (一)
  • C++ srand()和rand()用法
  • hadoop伪分布式搭建教程
  • 【react从入门到精通】React JSX详解
  • pytorch学习率设置——optimizer.param_groups、对不同层设置学习率、动态调整学习率。
  • Java中几种常量池面试总结
  • OVS常用命令与使用总结
  • Python_PyStray结合Tkinter显示系统托盘图标
  • SpringMVC与SpringWebFlux
  • 【Spring Security】| 从0到1编写一个权限认证 | 学会了吗?
  • MEET开发者 | 选择和努力一样重要,专访杭州三汇测试工程师齐雪莲
  • c++标准模板(STL)(std::array)(三)
  • 高程实验8队列
  • ROS Noetic版本 rosdep找不到命令 不能使用的解决方法
  • 剑指 Offer 51. 数组中的逆序对
  • 计算机视觉 | 人工智能 自己总结 (下)