2021-10-31每日打卡:每日打卡:腾讯精选50题
写在前面
“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,遵循LeetBook 列表/腾讯的刷题顺序,所有代码已通过。每日3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。
54.螺旋矩阵
- 移动边界法:注意while并不能检查到每个for循环,可能存在后面两个循环已经无需进行(上面两个循环导致的边界已经超过范围拉),所以还要加个if判断
class Solution:
def spiralOrder(self, matrix: List[List[int]]) -> List[int]:
# 上下左右
s,x,z,y = 0,len(matrix)-1, 0, len(matrix[0])-1
res = []
# 相等的情况也需要完成该遍遍历
while s<=x and z<=y:
# 注意range的最后一个取不到
for col in range(z,y+1):
res.append(matrix[s][col])
s+=1
if s>x: break
for row in range(s,x+1):
res.append(matrix[row][y])
y-=1
if y<z: break
for col in range(y,z-1,-1):
res.append(matrix[x][col])
x-=1
for row in range(x,s-1,-1):
res.append(matrix[row][z])
z+=1
return res
673. 螺旋矩阵II
- 移动边界:
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
# 上下左右
s,x,z,y = 0,n-1, 0, n-1
# 注意初始化结果的方法
res, num = [[None]*n for _ in range(s,x+1)], 1
while s<=x and z<=y:
for col in range(z,y+1):
res[s][col]= num
num+=1
s+=1
if s>x: break
for row in range(s,x+1):
res[row][y]=num
num+=1
y-=1
if y<z: break
for col in range(y,z-1,-1):
res[x][col]=num
num+=1
x-=1
for row in range(x,s-1,-1):
res[row][z]=num
num+=1
z+=1
return res
88. 合并两个有序数组
- 第一想法是“合并+排序”,然后想到可以“双指针比较-插入”,而为了前面元素不被覆盖,采取倒序转移:
class Solution:
def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None:
p1, p2, index = m-1, n-1, m+n-1
while (p1>=0 and p2>=0):
if nums1[p1]>nums2[p2]:
nums1[index]=nums1[p1]
p1-=1
else:
nums1[index]=nums2[p2]
p2-=1
index-=1
while p2>=0:
nums1[index]= nums2[p2]
index-=1
p2-=1