土豆炒青椒
土豆炒青椒

小白刷刷刷 59 ~ 旋转的矩阵 2

要把刷题当作一个事业来认真对待

基本信息

  • 题号:59
  • 题厂:微软
  • 难度系数:中



解题思路

在 n * n 的正方形矩阵中按顺时针螺旋方式填入 1 ~ n^2

  • 我们可以先创建一个 n * n 的空白矩阵,再按顺时针旋转思路对号填入数字。
  • 每到拐点(左上,右上,左下,右下)四个角时,改变旋转方向。



class Solution:
  def generateMatrix(self, n: int) -> List[List[int]]:
       # 创建 n * n 空白矩阵
       matrix = [[0] * n for i in range(n)]
       # 上、下、左、右 边界
       t, b, l, r = 0, n - 1, 0, n - 1 
       
       # i 为填入数字,从 1 开始填
       i = 1
       # 当前行、列 index 号,从 [0][0] 开始填
       cur_r, cur_c = 0, 0
  
       while l <= r and t <= b:
           # 从左往右填,每填一次 i + 1,当前列往右移动一格,直到矩阵最右列跳出循环
           while cur_c < r and cur_r == t:
              matrix[cur_r][cur_c] = i
              i += 1
              cur_c += 1
           # 填完之后,top 边界 + 1,已备下次循环旋转时判断
           t += 1
    
           # 沿着最右边界,从上往下填。。。每一次行数 + 1 而列数不变
           while cur_r < b and cur_c == r:
              matrix[cur_r][cur_c] = i
              i += 1
              cur_r += 1   

           r -= 1

           # 重复以上步骤,沿着下边界从右往左填。。。 
           while cur_r == b and cur_c > l:
              matrix[cur_r][cur_c] = i
              i += 1
              cur_c -= 1
  
           b -= 1
  
           # 沿左边界,由下往上填   
           while cur_r > t and cur_c == l:
              matrix[cur_r][cur_c] = i
              i += 1
              cur_r -= 1

           l += 1

        # 不要忘了,跳出循环后,最后一个格子还没有填。。。
        matrix[cur_r][cur_c] = i   

        return matrix


Constraints

  • 题目限制 1 <= n <= 20

考试时,向考官确认 n 的取值范围


Big O

  • Time:O(n^2)
  • space:因为创建矩阵,自然复杂度为 O(n^2)


测试

  • 常规测试:n == 某奇数;n == 某偶数
  • 边界测试: 当 n == 1 时的特殊案例; n == 20 时,算法是否效率够快



总结

  • 微软著名旋转矩阵系列题,中规中矩中档难度题。
  • 旋转矩阵问题在思路上,解体思路不难分析。
  • 此类问题在于处理转角时,最后一个格子不算,从而实现数组不越界又不漏掉格子


CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论