566_重塑矩阵

566.重塑矩阵

在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据。
给你一个由二维数组 mat 表示的 m x n 矩阵,以及两个正整数 r 和 c ,分别表示想要的重构的矩阵的行数和列数。
重构后的矩阵需要将原始矩阵的所有元素以相同的 行遍历顺序 填充。
如果具有给定参数的 reshape 操作是可行且合理的,则输出新的重塑矩阵;否则,输出原始矩阵。

示例1:
在这里插入图片描述
方法一:二维数组的一维表示

对于一个行数为 m,列数为 n,行列下标都从 00 开始编号的二维数组,我们可以通过下面的方式,将其中的每个元素 (i, j)(i,j) 映射到整数域内,并且它们按照行优先的顺序一一对应着 [0, mn)中的每一个整数。形象化地来说,我们把这个二维数组「排扁」成了一个一维数组。
映射公式:(i,j)→ i * n + j
同样,我们也可以将整数x映射回其在矩阵中的下标即:
i = x//n n为列数,即每行有多少个元素,x//n即排了完整的几行 ,i即为第几行
j = x %n % 取余操作,即不完整的那一行排了几个元素,j即第几列

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:

        m , n = len(mat) , len(mat[0])    # m,n为行数与列数

        if m * n != r * c:      # 判断是否能被重塑,只有元素个数相等的情况下才能被重塑,否则返回原矩阵
            return mat

        res = [[0] * c for _ in range(r)]    # 重塑后要返回的矩阵

        for x in range(m*n):    # 挨个遍历原矩阵中的元素
            res[x // c][x % c] = mat[x // n][x % n]    # 赋值

        return res 

方法二:直接遍历

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:

        m , n = len(mat) , len(mat[0])

        if m * n != r * c:
            return mat

        res = []    # 要返回的矩阵
        temp = []   # 保存每行元素的临时一维数组

        for nums in mat:    # 遍历
            for num in nums:   
                temp.append(num)    # 向临时一维数组中添加元素
                if len(temp) == c:   # 判断长度,长度 = c,则向res中添加
                    # res.append(temp)
                    res = res + [temp]    # 与append所起作用一样
                    temp = []      # 添加完成后temp数组置为空

        return res 

方法三:队列(简洁)

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:

        # m , n = len(mat) , len(mat[0])

        # if m * n != r * c:
            # return mat

        queue = [num for row in mat for num in row] if r * c == len(mat)*len(mat[0]) else []
        return [[queue.pop(0) for _ in range(c)] for _ in range(r)] if queue else mat 
        
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值