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;
};

参考资料