数组章节的进阶54. 螺旋矩阵、904. 水果成篮、76. 最小覆盖子串
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. 最小覆盖子串