0
点赞
收藏
分享

微信扫一扫

566. Reshape the Matrix*

566. Reshape the Matrix*

​​https://leetcode.com/problems/reshape-the-matrix/description/​​

题目描述

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.

解题思路

类似于 matlab 中的 reshape 函数, 将一个矩阵给 reshape. 如果无法 reshape, 就返回原矩阵. 两个矩阵以行来遍历的话相同.

思路: 对于元素个数为 ​​rows * cols​​​ 的矩阵, 在 ​​[0 ~ rows * cols - 1]​​​ 范围内的元素 ​​k,​​​ 对应于矩阵中的位置为 ​​(k/cols, k%cols)​​, 知道这一点后, 解法很简单. 另外, 发现使用两个循环还更快.

C++ 实现 1

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

C++ 实现 2

class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
int rows = nums.size(), cols = nums[0].size();
if ((rows * cols) != (r * c) || r <= 0 || c <= 0)
return nums;

vector<vector<int>> res(r, vector<int>(c));
for (int k = 0; k < rows * cols; ++k) {
res[k/c][k%c] = nums[k/cols][k%cols];
}
return res;
}
};

举报

相关推荐

0 条评论