LeetCode566 Reshape the matrix

介绍如何使用两种不同的方法在MATLAB中重塑矩阵,一种是通过转换为一维数组再重塑,另一种是在不使用额外存储空间的情况下直接重塑。

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.

我的方法:先将原来的数组存储到一个一维的数组中,然后再将一维数组中的数据一次放入新的二维数组中;

还有一种比较好的方法,不需要额外的存储空间,设定一个count,count来计算没存储到新的数组中,count加1,然后新的数组的行索引为count/c,列索引为count%c,这个方法减少了存储空间!

我自己还有一种方法也不需要额外的存储空间,用一个a来控制每行的输出结束,b来控制列数,a==r之后,让a=0,b++,这样来控制下!

下面是第一种方法:

class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        int m = nums.length;
        int n = nums[0].length;
        int [][] a = new int[r][c];
        int []b = new int[m*n];
        int bb=0;
        int x=0;
        if (m*n<r*c){
            return nums;
        }
        else{
            for(int i=0;i<m;i++){
                for(int j = 0;j<n;j++){
                    b[bb] = nums[i][j];
                    bb++;
                }
            }
            for(int i =0;i<r;i++){
                for(int j = 0;j<c;j++){
                    a[i][j] = b[x];
                    x++;
                }
            }
            return a;
        }    
    }
}

第二种方法:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值