2024.5.(17,18)力扣刷题记录-数组篇记录

目录

一、566. 重塑矩阵

1.模拟

2.二维数组的一维表示

3.内置函数

二、48. 旋转图像

1.辅组矩阵-deepcopy()

2.辅助矩阵2-切片

3.原地旋转

4.用翻转代替旋转


一、566. 重塑矩阵

1.模拟

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
        ans = [[0] * c for _ in range(r)]
        ans_x, ans_y = 0, 0
        for i, row in enumerate(mat):
                for j, x in enumerate(row):
                    ans[ans_x][ans_y] = x
                    ans_x, ans_y = (ans_x, ans_y + 1) if ans_y < c - 1 else (ans_x + 1, 0)
        return ans

2.二维数组的一维表示

来自官方题解(. - 力扣(LeetCode))。

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
        ans = [[0] * c for _ in range(r)]
        for i in range(m * n):
            ans[i // c][i % c] = mat[i // n][i % n]
        return ans 

3.内置函数

来自题解(. - 力扣(LeetCode))。这里必须要加tolist()(转来转去效率很低)或者改变定义函数时的输出,不然会因为类型不符合而报错。

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
        import numpy as np 
        return np.asarray(mat).reshape((r,c)).tolist()

二、48. 旋转图像

1.辅组矩阵-deepcopy()

主要是要理清,变化后的数组的横纵坐标是怎么由原数组得到的。可以先分为左上、右下、左下、右上来分别举例总结,最后发现是一个规律。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 辅组矩阵
        m = copy.deepcopy(matrix)
        n = len(matrix)
        for i in range(n):
            for j in range(n):
                matrix[j][n - 1 - i] = m[i][j]

2.辅助矩阵2-切片

来自官方题解(. - 力扣(LeetCode))。官方题解给出的找规律的方法值得我们学习。我们将第一行数字进行旋转,发现它们出现在第n - 1列,即可总结到:原数组的第i行元素旋转后会出现在n - 1 - i列。同理,我们将第一列数字进行旋转,发现它们出现在第1行,即可总结到:原数组的第j列元素旋转后会出现在第j行。这个方法即是:我们举特定的一(几)整行或者一(几)整列即可得到行号和列号的变化规律。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 辅助矩阵2-切片
        n = len(matrix)
        m = [[0] * n for _ in range(n)]
        for i in range(n):
            for j in range(n):
                m[j][n - 1 - i] = matrix[i][j]
        matrix[:] = m   # 这里需要注意

3.原地旋转

来自上面官方题解。妙啊!

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 原地旋转
        # 四个一轮回
        n = len(matrix)
        for i in range(n // 2):
            for j in range((n + 1) // 2): 
                matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i], matrix[i][j] = \
                matrix[i][j], matrix[j][n-1-i], matrix[n-1-i][n-1-j], matrix[n-1-j][i]

4.用翻转代替旋转

来自上面官方题解,通过两次翻转,达到和转换公式一样的效果。

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        # 用翻转代替旋转
        n = len(matrix)
        for i in range(n // 2):
            matrix[i], matrix[n - 1 - i] = matrix[n - 1 - i], matrix[i]
        for i in range(n):
            for j in range(i, n):
                matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]

感谢你看到这里!一起加油吧!

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值