[Leetcode] 566. 重塑矩陣


題目描述:

在MATLAB中,有一個非常有用的函數 reshape,它可以將一個矩陣重塑為另一個大小不同的新矩陣,但保留其原始數據。

給出一個由二維數組表示的矩陣,以及兩個正整數rc,分別表示想要的重構的矩陣的行數和列數。

重構后的矩陣需要將原始矩陣的所有元素以相同的行遍歷順序填充。

如果具有給定參數的reshape操作是可行且合理的,則輸出新的重塑矩陣;否則,輸出原始矩陣。

示例 1:

輸入: 
nums = 
[[1,2],
 [3,4]]
r = 1, c = 4
輸出: 
[[1,2,3,4]]
解釋:
行遍歷nums的結果是 [1,2,3,4]。新的矩陣是 1 * 4 矩陣, 用之前的元素值一行一行填充新矩陣。

示例 2:

輸入: 
nums = 
[[1,2],
 [3,4]]
r = 2, c = 4
輸出: 
[[1,2],
 [3,4]]
解釋:
沒有辦法將 2 * 2 矩陣轉化為 2 * 4 矩陣。 所以輸出原矩陣。

注意:

  1. 給定矩陣的寬和高范圍在 [1, 100]。
  2. 給定的 r 和 c 都是正數。

解題思路:

 相信matlab里的reshape函數大家都用過吧,就是那個函數!


首先什么只有當兩個矩陣的元素個數相等時才可能reshape不然就直接返回原矩陣按照要求。

然后由於是二維數組,我為了簡便就把原矩陣直接變成一維的了,然后直接下標order++存到新矩陣里就行啦,你也可以用雙重for循環直接映射過去也行就是稍微麻煩點我覺得,不過我這樣是浪費了空間復雜度了。

代碼實現(Java語言):

class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        if(nums.length * nums[0].length != r*c)
            return nums;
        int[] arr = new int[r*c];
        for(int i = 0; i < nums.length; i++){
            for(int j = 0; j< nums[0].length; j++){
                arr[i*nums[0].length + j] = nums[i][j];
            }
        }
        int[][] res = new int[r][c];
        int order = 0;
        for(int m = 0;m < r; m++){
            for(int n = 0; n < c;n++){
                res[m][n] = arr[order++];
            }
        }
        return res;
    }
}


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com