566. Reshape the Matrix

Leetcode 問題: 566. Reshape the Matrix

題目

In MATLAB, there is a handy function called reshape which can reshape an m x n matrix into a new one with a different size r x c keeping its original data.

You are given an m x n matrix mat and two integers r and c representing the number of rows and the number of columns of the wanted reshaped matrix.

The reshaped matrix should 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.

實現 MATLAB 對於矩陣的 reshape 功能,將 m * n 的矩陣轉換成 r * c 的矩陣,如果無法轉換,則直接回傳原始的矩陣

會傳入 原始的矩陣 mat,裡面有 m 列(row) * n 欄(column) 的資料,將它轉換成 r 列(row) * c 欄(column) 的資料

要按照原本的 列(row)欄(column) 的順序做轉換

Example

Input: mat = [[1,2],[3,4]], r = 1, c = 4
Output: [[1,2,3,4]]

566. Reshape the Matrix

Input: mat = [[1,2],[3,4]], r = 2, c = 4
Output: [[1,2],[3,4]]

566. Reshape the Matrix

演算法

1. 計算「來源矩陣」與「目標矩陣」欄位資料是否相符

欄位數量不相符則無法轉換,直接回傳原始矩陣

2. 遍歷整個原始的矩陣,將「原始矩陣」寫入到「目標矩陣」

從頭到尾遍歷整個 原始矩陣,由 列(row) 優先遍歷

然後將那個 列(row) 的所有 欄(column) 的資料取出塞到「目標矩陣」

答案

JavaScript

function matrixReshape(originalMatrix, targetRow, targetColumn) {
    // 原始矩陣「列 row」的數量
    var originalRowCount = originalMatrix.length;
    // 原始矩陣「欄 column」的數量
    var originalColumnCount = originalMatrix[0].length;
    if ((originalRowCount * originalColumnCount) != (targetRow * targetColumn)) {
        // 「原始欄位資料數量」與「目標欄位資料數量」不符,無法轉換
        return originalMatrix;
    }

    // 目標矩陣
    var targetMatrix = [];
    // let targetMatrix: number[][] = new Array();
    // 目標「列 row」的數量計數器
    var targetRowCounter = 0;
    // 目標「欄 column」的數量計數器
    var targetColumnCounter = 0;
    // 遍歷整個原始的矩陣,將「原始矩陣」寫入到「目標矩陣」
    for (var row = 0; row < originalRowCount; row++) {
        for (var column = 0; column < originalColumnCount; column++) {
            if (!targetMatrix[targetRowCounter]) {
                // 如果目標矩陣還沒設定,初始化目標矩陣「列 row」的資料列
                targetMatrix[targetRowCounter] = [];
            }
            // 將目標的「列 row」及「欄 column」的資料寫到目標矩陣位置
            targetMatrix[targetRowCounter][targetColumnCounter] = originalMatrix[row][column];
            targetColumnCounter++;
            if (targetColumnCounter == targetColumn) {
                // 如果已經達到目標矩陣數量
                // 將目標矩陣的「欄 column」位置重設,重新開始寫入到新的位置
                targetColumnCounter = 0;
                // 將目標矩陣的「列 row」位置移動到下一個位置
                targetRowCounter++;
            }
        }
    }
    return targetMatrix;
}

TypeScript

function matrixReshape(originalMatrix: number[][], targetRow: number, targetColumn: number): number[][] {
    // 原始矩陣「列 row」的數量
    let originalRowCount = originalMatrix.length;
    // 原始矩陣「欄 column」的數量
    let originalColumnCount = originalMatrix[0].length;

    if ((originalRowCount * originalColumnCount) != (targetRow * targetColumn)) {
        // 「原始欄位資料數量」與「目標欄位資料數量」不符,無法轉換
        return originalMatrix;
    }

    // 目標矩陣
    let targetMatrix: number[][] = [];
    // let targetMatrix: number[][] = new Array();
    // 目標「列 row」的數量計數器
    let targetRowCounter = 0;
    // 目標「欄 column」的數量計數器
    let targetColumnCounter = 0;

    // 遍歷整個原始的矩陣,將「原始矩陣」寫入到「目標矩陣」
    for (let row = 0; row < originalRowCount; row++) {
        for (let column = 0; column < originalColumnCount; column++) {
            if (!targetMatrix[targetRowCounter]) {
                // 如果目標矩陣還沒設定,初始化目標矩陣「列 row」的資料列
                targetMatrix[targetRowCounter] = [];
            }
            // 將目標的「列 row」及「欄 column」的資料寫到目標矩陣位置
            targetMatrix[targetRowCounter][targetColumnCounter] = originalMatrix[row][column];
            targetColumnCounter++;
            if (targetColumnCounter == targetColumn) {
                // 如果已經達到目標矩陣數量
                // 將目標矩陣的「欄 column」位置重設,重新開始寫入到新的位置
                targetColumnCounter = 0;
                // 將目標矩陣的「列 row」位置移動到下一個位置
                targetRowCounter++;
            }
        }
    }

    return targetMatrix;
};

參考資料