文档章节

矩阵变形 Reshape the Matrix

叶枫啦啦
 叶枫啦啦
发布于 2017/05/15 22:40
字数 756
阅读 28
收藏 0

In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new one with different size but keep its original data.

You're given a matrix represented by a two-dimensional array, and two positive integers r and c representing the row number and column number of the wanted reshaped matrix, respectively.

The reshaped matrix need to be filled with all the elements of the original matrix in the same row-traversing order as they were.

If the 'reshape' operation with given parameters is possible and legal, output the new reshaped matrix; Otherwise, output the original matrix.

Example 1:

Input: 
nums = 
[[1,2],
 [3,4]]
r = 1, c = 4
Output: 
[[1,2,3,4]]
Explanation:
The row-traversing of nums is [1,2,3,4]. The new reshaped matrix is a 1 * 4 matrix, fill it row by row by using the previous list.

Example 2:

Input: 
nums = 
[[1,2],
 [3,4]]
r = 2, c = 4
Output: 
[[1,2],
 [3,4]]
Explanation:
There is no way to reshape a 2 * 2 matrix to a 2 * 4 matrix. So output the original matrix.

Note:

  1. The height and width of the given matrix is in range [1, 100].
  2. The given r and c are all positive.

解决方案:

①需要判断矩阵是否能够正确的进行转换(总数目是否相等),其次难点在于数组的转换,我用了最简单的直接转换。用时13ms

public class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
       int len1 = nums.length;
       int len2 = nums[0].length;
       if(len1 * len2 != r * c){
           return nums;
       }
       int res[][] = new int[r][c];
       int row = 0;
       int col = 0;
       for(int i = 0; i < len1; i ++){
           for(int j = 0; j < len2; j ++){
               res[row][col] = nums[i][j];
               col ++;
               if(col == c){
                   row ++;
                   col = 0;
               }
           }
       }
       return res;
    }
}

②使用队列存储矩阵,此时该矩阵只有一行,更好存储,用时16 ms

public class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int len1 = nums.length;
        int len2 = nums[0].length;
        if (len1 * len2 != r * c) {
            return nums;
        }
        Queue<Integer> queue = new LinkedList<Integer>();
        for (int i = 0;i < len1 ;i ++ ) {
            for (int j = 0;j < len2 ;j ++ ) {
                queue.add(nums[i][j]);
            }
        }
        int res[][] = new int[r][c];
        for (int i = 0;i < r ;i ++ ) {
            for (int j = 0;j < c ;j ++ ) {
                res[i][j] = queue.remove();
            }
        }
        return res;
    }
}

③使用除法和模数,实现比较简单,但是需要深入理解数组的原理。我们想一下二维矩阵存储在一维空间时的存储方法为,nums[i][j]存储在第nums[i*k+j]个位置,其中k表示矩阵的列数,反之,当我们由一维回到二维矩阵时,设数组下标为count,则二维矩阵的显示为nums[count/k,count%k],这样,我们就可以得到对应的矩阵。 用时16ms.

public class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int len1 = nums.length;
        int len2 = nums[0].length;
        if (len1 * len2 != r * c) {
            return nums;
        }
        int res[][] = new int[r][c];
        int count = 0;
        for (int i = 0;i < len1 ;i ++ ) {
            for (int j = 0;j < len2 ;j ++ ) {
                res[count / c][count % c] = nums[i][j];
                count ++;
            }
        }
        return res;
    }
}

public class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int len1 = nums.length;//行数
        int len2 = nums[0].length;//列数
        if(len1 * len2 != r * c){
            return nums;
        }
        int res[][] = new int[r][c];
        int count = 0;
        for (int i = 0;i < len1 ;i ++ ) {
            for (int j = 0;j < len2 ;j ++ ) {
                count = i * len2 + j;
                res[count / c][count % c] = nums[i][j];
            }
        }
        return res;
    }
}

以上三种方法均满足时间复杂度:O(m∗n)遍历了整个矩阵,空间复杂度:O(m∗n),结果矩阵所占用的空间

© 著作权归作者所有

叶枫啦啦
粉丝 14
博文 583
码字总数 400448
作品 0
海淀
私信 提问
LeetCode笔记:566. Reshape the Matrix

问题(Easy): In MATLAB, there is a very useful function called 'reshape', which can reshape a matrix into a new one with different size but keep its original data. You're give......

Cloudox_
2018/01/08
0
0
numpy中的matrix和array

array数组 numpy中最基本(默认)的类型是array,他的相关操作都是按元素操作的即用作数值计算当中(按元素操作有+,-,,/,*等)。相乘举例:

Galy_绿
2016/07/31
25
0
python 矩阵转置transpose--实战应用详解

在读图片时,会用到这么的一段代码: imagevectorlen = np.prod(image_size)#总元素大小,3*55*47 img = Image.open(path) arrimg = np.asarray(img, dtype='float64') arrimg = arrimg.tran......

AnneQiQi
2017/03/08
0
0
Transform 的简单理解

canvas里面的transfrom与css3中的基本是一样的,唯一的不同是原点,canvas的默认原点是图形的左上角,css3是图形的中心, translate(x,y)方法 是用来移动canvas和它的原点到一个不同的位置,...

tianyawhl
2018/12/07
19
0
CSS3变形详情介绍

WEB设计师借助CSS3可以轻松实现倾斜,缩放,移动及翻转元素 1.变形简介 CSS3变形时一些效果的集合,比如平移、旋转以及缩放效果,每个效果都称为变形函数(Transform Function),在CSS没有变...

TyrionJ的博客
2017/12/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

ES6

ES6:不改变原理的基础上,让API变得更简单 一、let:代替var用于声明变量 1、var的缺点: (1)声明提前 (2)没有块级作用域 2、let的优点: (1)组织了申明提前 (2)让let所在的块({}),...

wytao1995
今天
3
0
kubernetes 环境搭建 —— minikube

创建集群 minikube start 搭建好 k8s 集群后,可以查看集群的状态以及部署应用。主要用到的是 k8s 的 api,这通常需借助于 kutectl 命令行工具 基本操作 kubectl versionkubectl cluster-i...

lemos
今天
9
0
关于js混淆与反混淆还原操作

使用js的混淆加密,其目的是为了保护我们的前端代码逻辑,对应一些搞技术吃饭的公司来说,为了防止被竞争对手抓取或使用自己的代码,就会考虑如何加密,或者混淆js来达到代码保护。 1、为什么...

开源oschina
今天
11
0
用盛金公式解三次方程(ansi c版)

/* cc cubic.c -lm gcc cubic.c -lm Shengjin's Formulas Univariate cubic equation aX ^ 3 + bX ^ 2 + cX + d = 0, (a, b, c, d < R, and a!= 0). Multiple root disc......

wangxuwei
今天
9
0
JBolt开发平台入门(16)- 弹出Dialog显示指定区域的html内容

在JBolt里,有个主从表Demo。 子表中除了普通的table显示,还有其它从表显示形式 比如下方案例:是针对一个升级管理子表中存放版本的changelog富文本信息。 需求是点击左上角的弹出查看按钮,...

山东-小木
今天
46
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部