一、复习
54、 螺旋矩阵,通过了,写起来难度不大——除了应该和rows、cols比大小,错写成col和row了。
我觉得这道题最神奇的地方就是方向移动的表示以及转变了——通过数组记录方向变化+利用%的机制实现循环妙啊!!!
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
rows = len(matrix)
cols = len(matrix[0])
size = rows*cols
directions = [[0,1],[1,0],[0,-1],[-1,0]]
dir_index = 0
row,col=0,0
res=[]
hash = [[False]*cols for _ in range(rows)]
for i in range(size):
item = matrix[row][col]
res.append(item)
hash[row][col]=True
next_row=row+directions[dir_index][0]
next_col = col+directions[dir_index][1]
if next_row>=rows or next_col>=cols or hash[next_row][next_col]==True:
dir_index = (dir_index+1)%4
row=row+directions[dir_index][0]
col = col+directions[dir_index][1]
else:
row = next_row
col = next_col
return res
56. 合并区间
1、感觉先用python sort(),然后直接O(n)复杂度判断就ok了。
2、刚开始写的时候发现,直接在interval上操作不行,不方便控制进行扩充数组大小的操作(找不到操作的位置),所以又设了一个数组res
3、忘记讨论右边界也在res最后一个里面的情况了。所以情况要想全。一共三种:完全大于;部分大雨;包含。
class Solution:
def merge(self, intervals: List[List[int]]) -> List[List[int]]:
intervals.sort()
res=[intervals[0]]
for i in range(1,len(intervals)):
if res[-1][1] >= intervals[i][1]:
continue
elif res[-1][1] >= intervals[i][0]:
res[-1] = [res[-1][0],intervals[i][1]]
else:
res.append(intervals[i])
return res
4、效率啥的非常低,看看别人的版本。
我感觉高赞答案和我的差不多,都是先将左区间排序,统一左区间的大小——即小的在前,然后相邻两个进行合并就只剩下三种情况了。逐一排序即可。
57. 插入区间
1、感觉先加入数组,然后再合并就好了。
2、没啥毛病,时间复杂度还挺强。
class Solution:
def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]:
intervals.append(newInterval)
intervals.sort()
res = [intervals[0]]
for i in range(1,len(intervals)):
if res[-1][1]>=intervals[i][1]:
continue
elif res[-1][1]>=intervals[i][0]:
res[-1]=[res[-1][0],intervals[i][1]]
else:
res.append(intervals[i])
return res
3、看看别人咋写的,啊懒得看了。撤了