📜  将矩阵向右旋转 K 次(1)

📅  最后修改于: 2023-12-03 15:39:19.804000             🧑  作者: Mango

将矩阵向右旋转 K 次

矩阵的向右旋转是指将矩阵的每一行向右移动K个位置,空出的位置用0来填充。这种旋转可以通过转置矩阵,然后再把每一行翻转来实现。本题的目的就是实现这种矩阵旋转操作。

解法
方法一:暴力法

我们可以先对每一行做一个右移K的操作,使用循环队列来存储每一行,然后再将这些行直接拼接起来。

时间复杂度:$O(NM)$,其中N和M分别表示矩阵的行数和列数。

def rotate(matrix: List[List[int]], k: int) -> List[List[int]]:
    n, m = len(matrix), len(matrix[0])
    res = []
    for row in matrix:
        q = collections.deque(row)
        q.rotate(k)
        res.append(list(q))
    return res
方法二:翻转法

我们可以先将矩阵进行转置操作,然后再将每一行翻转即可。

时间复杂度:$O(NM)$,其中N和M分别表示矩阵的行数和列数。

def rotate(matrix: List[List[int]], k: int) -> List[List[int]]:
    n, m = len(matrix), len(matrix[0])
    # 转置矩阵
    for i in range(n):
        for j in range(i, m):
            matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
    # 翻转每一行
    for i in range(n):
        matrix[i] = matrix[i][::-1]
    # 对于k >= m的情况,相当于右移了k % m次
    k %= m
    # 翻转每一行
    for i in range(n):
        matrix[i] = matrix[i][-k:] + matrix[i][:-k]
    return matrix
总结

本题涉及到了比较基础的矩阵操作,熟练掌握这些操作是程序员的基本功。在代码实现方面,我们可以使用循环队列来处理每一行的操作,也可以使用Python内置的切片来完成对每一行的移动和翻转。