Python刷leetcode--剑指 Offer 29. 顺时针打印矩阵

挺恶心的一道题。。而且出现频率挺高的。

0. 解法零

面试最好不要写这种,竞赛赶时间可以写一下。面试想让你写下面的两种

    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        ans = []
        while matrix:
            ans.extend(matrix[0])
            matrix = list(zip(*matrix[1:]))[::-1]
        return ans

1. 解法一

class Solution:
    def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
        if not matrix:
            return []
        i, j = 0, 0
        w = len(matrix[0])
        h = len(matrix)
        ans = []
        while i < (len(matrix)+1) // 2 and j < (len(matrix[0])+1)//2:
            flag = 0
            flag2 = 0
            for _ in range(w - 1):
                flag2 = 1
                ans.append(matrix[i][j])
                j += 1
            for _ in range(h - 1):
                flag = 1
                ans.append(matrix[i][j])
                i += 1
            for _ in range(w - 1):
                if not flag or not flag2:
                    break
                ans.append(matrix[i][j])
                j -= 1
            for _ in range(h - 2):
                if not flag or not flag2:
                    break
                ans.append(matrix[i][j])
                i -= 1
            ans.append(matrix[i][j])
            w -= 2
            h -= 2
            j += 1
            # h += 1
        return ans

2. 解法二

还有一种解法是递归。

©️2020 CSDN 皮肤主题: 像素格子 设计师:CSDN官方博客 返回首页