数组章节的进阶54. 螺旋矩阵、904. 水果成篮、76. 最小覆盖子串

wuyijia / 2023-08-28 / 原文

54. 螺旋矩阵

 1 class Solution:
 2     def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
 3         m, n = len(matrix), len(matrix[0])
 4         res = [] #存放遍历后的结果
 5         startx = starty = 0
 6 
 7         for offset in range(min(m, n)//2): #offset初始值为0 左闭右开 range(1,1):不循环了
 8 
 9             for j in range(starty, n-offset-1): #从左到右
10                 res.append(matrix[startx][j])
11 
12             for i in range(startx, m-offset-1):#从上到下
13                 res.append(matrix[i][n-offset-1])
14 
15             for j in range(n-offset-1, starty,-1):#从右到左
16                 res.append(matrix[m-offset-1][j])
17 
18             for i in range(m-offset-1,startx, -1): #从下到上
19                 res.append(matrix[i][starty])
20             
21             startx += 1
22             starty += 1
23         
24         if min(m, n) % 2 == 1:
25             offset = min(m, n) // 2
26             if m <= n:
27                 for j in range(offset, n-offset):
28                     res.append(matrix[offset][j])
29             else:
30                 for i in range(offset, m-offset):
31                     res.append(matrix[i][n-offset-1])
32         
33         return res

 904. 水果成篮

 1 class Solution:
 2     def totalFruit(self, fruits: List[int]) -> int:
 3         #哈希表(键:树的种类,值:出现的次数)记录滑动窗口内的数,以及出现的次数
 4         cnt = Counter()
 5 
 6         left = 0 #滑动窗口的左边界
 7         ans = 0 #记录收集水果的最大数目
 8 
 9         #滑动窗口的右边界在循环里迭代器里赋予初值
10         for right, x in enumerate(fruits):
11             cnt[x] += 1
12             while len(cnt) > 2:
13                 cnt[fruits[left]] -= 1
14                 if cnt[fruits[left]] == 0:
15                     cnt.pop(fruits[left])
16                 left += 1
17             ans = max(ans, right-left+1)
18         
19         return ans

76. 最小覆盖子串