LeetCode 566. 重塑矩阵 C++/Python

CSDN21天学习挑战赛
在这里插入图片描述

欢迎加入【Linux C/C++/Python社区】一起探讨和分享Linux C/C++/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。


566. 重塑矩阵

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。

给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 rc ,分别表示想要的重构的矩阵的行数和列数。

重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。

如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例 1:

在这里插入图片描述

输入:mat = [[1,2],[3,4]], r = 1, c = 4
输出:[[1,2,3,4]]

示例 2:

在这里插入图片描述

输入:mat = [[1,2],[3,4]], r = 2, c = 4
输出:[[1,2],[3,4]]

提示:

  • m == mat.length
  • n == mat[i].length
  • 1 <= m, n <= 100
  • -1000 <= mat[i][j] <= 1000
  • 1 <= r, c <= 300

C++版

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

Python版

#566_重塑矩阵

#暴力解法,把原矩阵按顺序遍历为一行,挨个取值放入新矩阵  时间复杂度O(mn)
class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
        if (len(mat) * len(mat[0])) != (r * c):
            return mat
        li = list()
        for row in mat:
            for v in row:
                li.append(v)
        ret = list()
        tmp = list()
        for j in range(r):
            for i in range(c):
                tmp.append(li.pop(0))
            ret.append(tmp)
            tmp = []
        return ret
		

'''
方法二:将原矩阵映射为一行,然后映射为新矩阵,映射关系为
1 2 3										1 2
4 5 6     ---->     1 2 3 4 5 6   ---->     3 4
											5 6
old[0][0]  		=  tmp[0]  =  new[0][0]
old[0][1]  		=  tmp[1]  =  new[0][1]
old[0][3]  		=  tmp[2]  =  new[1][0]
old[x/3][x%3]  	=  tmp[x]  =  new[x/2][x%2]											
old[x/old的列数][x%old的列数]  	=  tmp[x]  =  new[x/new的列数][x%new的列数]	
'''
class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
        if (len(mat) * len(mat[0])) != (r * c):
            return mat
        ret = [[0 for i in range(c)] for j in range(r)] #构造一个r*c的0矩阵
        for i in range(r * c):
            ret[i//c][i % c] = mat[i//len(mat[0])][i % len(mat[0])]
        return ret


在这里插入图片描述
在这里插入图片描述


posted @ 2022-08-09 10:46  Mindtechnist  阅读(10)  评论(0编辑  收藏  举报  来源