python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵

螺旋矩阵&旋转矩阵

  • 54 螺旋矩阵
    • 方法一:利用numpy库来做(问题:类型问题,pycharm通过,力扣不识别(原因是List转numpy.array之后,结果每次extend也是darray 类型,每次extend时都需要使用array.tolist()转化))已解决该问题
    • 方法二:数组来做
  • 48 旋转矩阵
  • 总结:逆时针旋转:先转置再翻转;顺时针旋转:先翻转再转置
  • 566.重塑矩阵
    • 解法:二维数据扁平化(i:index//列数,j:index%列数)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/spiral-matrix

54 螺旋矩阵

给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵_第1张图片

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:
python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵_第2张图片

输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

思路:将第一行extend进结果数组里,然后删除第一行,再使该矩阵逆时针旋转90度,再将第一行extend… 如此往复,直到矩阵元素为零

方法一:利用numpy库来做(问题:类型问题,pycharm通过,力扣不识别(原因是List转numpy.array之后,结果每次extend也是darray 类型,每次extend时都需要使用array.tolist()转化))已解决该问题

class Solution:
    def spiralOrder(self, matrix):
        # List转numpy.array
        matrix = np.array(matrix)
        res = []
        while 1:
            # 没有元素的时候结束循环
            if matrix.size == 0:
                return res
            res.extend(matrix[0].tolist())
            # 删除第一行
            matrix = np.delete(matrix, 0, axis=0)
            # 矩阵逆时针旋转90度
            matrix = np.transpose(matrix)
            matrix = matrix[::-1, :]

方法二:数组来做

其中:利用zip 实现矩阵转置

"""
[[1,2,3],
[4,5,6],
[7,8,9]]
"""

d=list(zip(*[[1,2,3],[4,5,6],[7,8,9]]))
print(d) 
"""
[(1, 4, 7),
 (2, 5, 8), 
 (3, 6, 9)]
"""
	

所以:逆时针旋转90度

d=list(zip(*[[1,2,3],[4,5,6],[7,8,9]]))[::-1]
print(d)

"""
[(3, 6, 9), 
(2, 5, 8),
(1, 4, 7)]
"""

到这里已经足够解决问题了,但是我们想让序列中每一个元素也变为序列而非元组

d=list(map(list,list(zip(*[[1,2,3],[4,5,6],[7,8,9]]))[::-1]))
print(d)
"""
[[3, 6, 9], 
[2, 5, 8],
[1, 4, 7]]
"""

得到最终算法

class Solution:
    def spiralOrder(self, matrix):
        res=[]
        while matrix:
        	#存第一行
            temp = matrix.pop(0)
            res.extend(temp)
            #将矩阵逆时针旋转90度
            matrix = list(map(list,list(zip(*matrix))[::-1]))
        return res

48 旋转矩阵

在解决54题的时候发现了48题,所以顺便解决
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/rotate-image

矩阵旋转参考了该篇博客

给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。

你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。

示例 1:

python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵_第3张图片

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[7,4,1],[8,5,2],[9,6,3]]

示例 2:
python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵_第4张图片

输入:matrix = [[5,1,9,11],[2,4,8,10],[13,3,6,7],[15,14,12,16]]
输出:[[15,13,2,5],[14,3,4,1],[12,6,8,9],[16,7,10,11]]

示例 3:

输入:matrix = [[1]]
输出:[[1]]
示例 4:

输入:matrix = [[1,2],[3,4]]
输出:[[3,1],[4,2]]

class Solution:
    def rotate(self, matrix: List[List[int]]) -> None:
        """
        Do not return anything, modify matrix in-place instead.
        """
        matrix[:] = list(map(list,list(zip(*matrix[::-1]))))
        # 注意下面的代码力扣会认为非原地修改所以不会通过
        #matrix = list(map(list,list(zip(*matrix[::-1]))))

总结:逆时针旋转:先转置再翻转;顺时针旋转:先翻转再转置

566.重塑矩阵

题目:(链接)
python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵_第5张图片
python 每日一题 54&48 螺旋矩阵&旋转矩阵; 566 重塑矩阵_第6张图片

解法:二维数据扁平化(i:index//列数,j:index%列数)

class Solution:
    def matrixReshape(self, mat: List[List[int]], r: int, c: int) -> List[List[int]]:
        # 计算原矩阵的行数和列数
        row_nums = len(mat)
        column_nums = len(mat[0])

        # 如果 r,c 不合规,直接输出原矩阵
        if r * c != row_nums * column_nums:
            return mat

        # 准备指定行列的空矩阵
        res = [[0]*c for column in range(r)] # 每一行有c列个元素,一共有r行
        # i:index//列数,j:index%列数
        for index in range(r*c):
            res[index//c][index%c] = mat[index//column_nums][index%column_nums]
        return res

你可能感兴趣的:(leetcode,python,算法,leetcode,numpy)