题目描述

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.

解法一

思路

这题其实可以理解成就是一维数组的复制,只需要跟着index走就好了,只不过这里index的取值范围是[0, r*c)而已。那么怎么根据index得到实际在二维数组中的位置呢,也很容易,就是(index / c, index % c)。

这里有个边界条件需要注意,根据题意,当新的二维矩阵较当前二维矩阵“大”时,直接返回当前二维矩阵即可(即不作零填充)。

Python

class Solution(object):
    def matrixReshape(self, nums, r, c):
        """
        :type nums: List[List[int]]
        :type r: int
        :type c: int
        :rtype: List[List[int]]
        """
        if not nums:
            return nums
        m = len(nums)
        n = len(nums[0])
        if m * n < r * c:
            return nums
        new_nums = [[0] * c for _ in range(r)]
        for i in range(r * c):
            new_nums[i // c][i % c] = nums[i // n][i % n]
        return new_nums

Java

public class Solution {
    public int[][] matrixReshape(int[][] nums, int r, int c) {
        if (nums.length == 0) {
            return nums;
        }
        int m = nums.length;
        int n = nums[0].length;
        if (m * n < r * c) {
            return nums;
        }
        int[][] newNums = new int[r][c];
        for (int i = 0; i < r * c; i++) {
            newNums[i / c][i % c] = nums[i / n][i % n];
        }
        return newNums;
    }
}

C++

class Solution {
public:
    vector<vector<int>> matrixReshape(vector<vector<int>> &nums, int r, int c) {
        if (nums.empty()) {
            return nums;
        }
        int m = nums.size();
        int n = nums[0].size();
        if (m * n < r * c) {
            return nums;
        }
        vector<vector<int>> newNums(r, vector<int>(c));
        for (int i = 0; i < r * c; i++) {
            newNums[i / c][i % c] = nums[i / n][i % n];
        }
        return newNums;
    }
};