977. 有序数组的平方 - 力扣(LeetCode)
双指针法一次AC,主要思想为,从大往小保存然后倒序返回
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
if len(nums) == 0:
return nums
new_nums = []
l = 0
r = len(nums)-1
while l <= r:
if abs(nums[l]) >= abs(nums[r]):
new_nums.append(nums[l]**2)
l += 1
else:
new_nums.append(nums[r]**2)
r -= 1
return new_nums[::-1]
209. 长度最小的子数组 - 力扣(LeetCode)
大体知道要用滑动窗口去做,但是对于i和j如何更新没想清楚。
扫了下代码随想录的思路就开始写了,提交了几次才通过,遇到的坑有
- 边界条件的判断
- 需要对是否存在满足题意的子数组进行判断,因为min_len一开始是用的比较大的值
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
_sum, i, j = 0, 0, 0
min_len = len(nums) + 1
# 左闭右闭
for j in range(len(nums)):
_sum += nums[j]
if _sum < target: # 需要继续移动j
continue
else:
while _sum >= target and i <= j: # 移动i到边界
min_len = min(min_len, j-i+1)
_sum -= nums[i]
i += 1
if min_len <= len(nums):
return min_len
else:
return 0
59. 螺旋矩阵 II - 力扣(LeetCode)
这题之前做过,当时一次AC,大体就是给n取几个特殊值观察一下规律,这次因为时间原因就不具体做了
大致扫了下代码随想录,关键点在于区间边界的明确,是左闭右开还是左闭右闭
总结
- 无穷大可以用float(‘inf’)
- 滑动窗口的更新需要重点复习
滑动窗口的更新一般涉及两个步骤:滑动和添加新数据。
滑动:滑动窗口的基本操作就是滑动,也就是向前移动一定的步长。通常,这涉及到将窗口中最早的数据移除。(一般涉及到循环,比如while)
添加新数据:滑动窗口滑动之后,需要用新数据填补窗口中的空缺。这通常涉及将新数据添加到窗口的末尾。