[LeetCode] Reshape the Matrix 重塑矩阵
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:
- The height and width of the given matrix is in range [1, 100].
- The given r and c are all positive.
这道题让我们实现矩阵大小的重塑,也就是实现 Matlab 中的 reshape 函数,博主也经常使用 matlab,对这个函数还是比较的熟悉的。对于这种二维数组大小重新非配的问题的关键就是对应位置的坐标转换,最直接的办法就是先把原数组拉直,变成一条直线,然后再组成新的数组。所以这道题我们先判断给定数组是否能重塑成给定的大小,就是看两者的元素总数是否相同,直接行数乘以列数即可,然后我们新建一个目标大小的数组,并开始遍历,对于每个位置,我们先转为拉直后的一维坐标,然后在算出在原数组中的对应位置赋值过来即可,参见代码如下:
解法一:
class Solution { public: vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) { 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 < r; ++i) { for (int j = 0; j < c; ++j) { int k = i * c + j; res[i][j] = nums[k / n][k % n]; } } return res; } };
下面这种方法整体思路和上面没啥区别,但是只使用了一个循环,直接就是遍历拉直后的一维数组的坐标,然后分别转换为两个二维数组的坐标进行赋值,参见代码如下:
解法二:
class Solution { public: vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) { 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 < r * c; ++i) { res[i / c][i % c] = nums[i / n][i % n]; } return res; } };
参考资料:
https://leetcode.com/problems/reshape-the-matrix/
https://discuss.leetcode.com/topic/87851/java-concise-o-nm-time
相关文章
- PRVF-5436 : The NTP daemon running on one or more nodes lacks the slewing option "-x"
- Leetcode: Combination Sum IV && Summary: The Key to Solve DP
- Leetcode: Find the Celebrity
- Leetcode: Min Stack
- Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding.
- ERROR ITMS-90717: “Invalid App Store Icon. The App Store Icon in the asset catalog in ‘HBuilder.app‘
- JS leetcode 反转字符串 题解分析
- JS leetcode 实现strStr()函数 题解分析
- hyper-v启动虚拟机时提示“The application encountered an error while attempting to change the state of the machine ‘虚拟机名称'”如何处理?
- The GuidRepresentation for the reader is CSharpLegacy, which requires the binary sub type to be Uuid
- Microsoft SQL Server 17导出xlsx文件时报错:The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. (System.Data)
- [LeetCode]1029. 两地调度
- The operation names in the portType match the method names in the SEI or Web service implementation class.
- Mysql_解决The total number of locks exceeds the lock table size错误
- 【LeetCode】59. Spiral Matrix II
- 【LeetCode】61. Rotate List
- 【LeetCode】124. Binary Tree Maximum Path Sum
- Leetcode_Wildcard Matching
- LeetCode——Palindrome Partitioning
- [LeetCode] 1260. Shift 2D Grid 二维网格迁移
- [LeetCode] 1237. Find Positive Integer Solution for a Given Equation 找出给定方程的正整数解
- [LeetCode] 1221. Split a String in Balanced Strings 分割平衡字符串
- [LeetCode] 1090. Largest Values From Labels 标签中的最大价值
- [LeetCode] 967. Numbers With Same Consecutive Differences 连续差相同的数字
- [LeetCode] Erect the Fence 竖立栅栏
- [LeetCode] 277. Find the Celebrity 寻找名人
- [LeetCode] 249. Group Shifted Strings 群组偏移字符串
- [LeetCode] 238. Product of Array Except Self 除本身之外的数组之积
- LeetCode二叉树路径总和
- 若依前后端分离部署,出现 “无法访问系统资源 401”或者 “The request was rejected because the URL contained a potentially malicious String
- The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.