977.有序数组的平方
同时获取两个信息,过程中经过比较后放入结果,可以考虑双指针
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
l, r, i = 0, len(nums)-1, len(nums)-1
res = [float('inf')] * len(nums) # 需要提前定义列表,存放结果
while l <= r:
if nums[l] ** 2 < nums[r] ** 2: # 左右边界进行对比,找出最大值
res[i] = nums[r] ** 2
r -= 1 # 右指针往左移动
else:
res[i] = nums[l] ** 2
l += 1 # 左指针往右移动
i -= 1 # 存放结果的指针需要往前平移一位
return res
209.长度最小的子数组
滑动窗口是双指针的变形,也是同时获取两个信息,过程中不再是比较而是合作得出结果与目标比较。
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
s,f=0,0
res=float('inf')
cur_sum=0
l=len(nums)
while f<l:
cur_sum+=nums[f]
while cur_sum>=target:
res=min(res,f-s+1)
cur_sum-=nums[s]
s+=1
f+=1
return res if res!=float('inf') else 0
59.螺旋矩阵II
本题有点复杂,主要是旋转的逻辑和规则要考虑全面,注意offset和中间点。另外,本题也要考虑开闭区间的问题
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
nums = [[0] * n for _ in range(n)]
x, y = 0, 0 # 起始点
loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点
count = 1 # 计数
for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始
for i in range(y, n - offset) : # 从左至右,左闭右开
nums[x][i] = count
count += 1
for i in range(x, n - offset) : # 从上至下
nums[i][n - offset] = count
count += 1
for i in range(n - offset, y, -1) : # 从右至左
nums[n - offset][i] = count
count += 1
for i in range(n - offset, x, -1) : # 从下至上
nums[i][y] = count
count += 1
x += 1 # 更新起始点
y += 1
if n % 2 != 0 : # n为奇数时,填充中心点
nums[mid][mid] = count
return nums
总结
数组问题有两个考点,一个是开闭区间的考虑,另一个是双指针。