(Week 8)Python-Leetcode:Spiral Matrix, Spiral Matrix II

54. Spiral Matrix

给定m*n矩阵,以螺旋式的顺序返回矩阵中的所有元素

Example 1:
Input:
[
 [ 1, 2, 3 ],
 [ 4, 5, 6 ],
 [ 7, 8, 9 ]
]
Output: [1,2,3,6,9,8,7,4,5]
Example 2:
Input:
[
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12]
]
Output: [1,2,3,4,8,12,11,10,9,5,6,7]
解题思路

  由题意,可将问题视为选择不同起点,并依次绕矩阵顺时针旋转一周,如Example 1中需绕两周,起点分别为1和5,其中5所绕的圈只有其本身。显然需确定绕圈的圈数、每次绕圈的边界即可。

  绕圈圈数: c=(min(m,n)+1)//2 c = ( m i n ( m , n ) + 1 ) / / 2

  绕圈起点: (k,k)while0<=k<c ( k , k ) w h i l e 0 <= k < c

  绕圈边界:根据起点与m、n的关系确定

程序代码
class Solution:
    def spiralOrder(self, matrix):
        """
        :type matrix: List[List[int]]
        :rtype: List[int]
        """
        res = []
        if len(matrix) == 0 or len(matrix[0]) == 0:
            return res
        n, m = len(matrix), len(matrix[0])
        c = min(n, m)   #确定圈数
        for i in range(0, (c + 1) // 2):
            #append the ith circle
            res += matrix[i][i: m - i]                  #左到右
            for j in range(i + 1, n - i):               #上到下
                res.append(matrix[j][m - i - 1])
            if n - i - 1 != i:                          #判断是否与左到右重复
                for j in range(m - i - 2, i - 1, -1):   #右到左
                    res.append(matrix[n - i - 1][j])
            if m - i - 1 != i:                          #判断是否与上到下重复
                for j in range(n - i - 2, i, -1):       #下到上
                    res.append(matrix[j][i])
        return res

59. Spiral Matrix II

给定一个整数n,生成一个方阵,其元素为 [1,n2] [ 1 , n 2 ] 的数字以螺旋式填充至方阵中

Example 1
Input: 3
Output:
[
 [ 1, 2, 3 ],
 [ 8, 9, 4 ],
 [ 7, 6, 5 ]
]
解题思路

  在Spiral Matrix的基础上,增加一个count变量,每次走到一个位置,将count赋值给对应位置并自增即可。

程序代码
class Solution:
    def generateMatrix(self, n):
        """
        :type n: int
        :rtype: List[List[int]]
        """
        if n == 0:
            return []
        row = [0 for i in range(0, n)]
        res = [row[:] for i in range(0, n)]
        count = 0   #生成方阵及count变量
        for i in range(0, (n + 1) // 2):        #依次循环每一圈
            #append the ith circle
            for j in range(i, n - i):           #左到右
                count += 1
                res[i][j] = count
            for j in range(i + 1, n - i):       #上到下
                count += 1
                res[j][n - i - 1] = count
            if n - i - 1 != i:                  #判断是否与左到右、上到下重复
                for j in range(n - i - 2, i - 1, -1):   #右到左
                    count += 1
                    res[n - i - 1][j] = count
                for j in range(n - i - 2, i, -1):       #下到上
                    count += 1
                    res[j][i] = count
        return res

你可能感兴趣的:((Week 8)Python-Leetcode:Spiral Matrix, Spiral Matrix II)