长度最小的子数组
刷题日期:2024-04-18
标签: #数组 #简单
209.长度最小的子数组
思路
滑动窗口&双指针
算法思路
定义双指针, 分别代表滑动窗口的左右两端; 然后定义子数组的和的值Sum; 首先比较子数组和和target
大小, 若和大, 则子数组收缩(左端向左走),并记录此时的子数组长度, 若和小,则子数组扩张(右端向左走), 直到整个数组遍历完成.
算法细节
1. 滑动窗口
滑动窗口的本质并不是仅仅用窗口左端和右端定义一个子数组, 而是提前将滑动窗口定义好(本题中为子数组的和), 每次滑动仅变动一次;倘若仅用端点定义, 每次比较时再求和, 便会超时.
Code
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
left = 0
right = 0
min_len = float('inf')
Sum = nums[left]
while left < len(nums) and right < len(nums):
if Sum < target:
right += 1
if right < len(nums):
Sum += nums[right]
else:
min_len = min(min_len, right + 1 - left)
Sum -= nums[left]
left += 1
if min_len == float('inf'):
return 0
else:
return min_len
有序数组的平方
刷题日期:2024-04-18
标签: #数组 #简单
977.有序数组的平方
思路
双指针法
算法思路
原有数组按照非递减排序, 那么数组中绝对值最大的肯定在数组的两端, 易联想到双指针法. 两个指针分别放在数组两端, 然后分别比较对应数字平方的大小, 若left
大则left
的值自增1, 并把left
对应数字的平方写进新数组的最后一位, 反之亦然. 以此类推直到新数组写满
算法细节
1.
Code
class Solution:
def sortedSquares(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums) - 1
result = [0] * len(nums)
for i in range(len(nums) - 1, -1, -1):
if nums[left] ** 2 >= nums[right] ** 2:
result[i] = nums[left] ** 2
left += 1
else:
result[i] = nums[right] ** 2
right -= 1
return result
螺旋矩阵II
刷题日期:2024-04-18
标签: #数组 #简单
59.螺旋矩阵II
思路
循环不变量
算法思路
循环时左闭右开, 把圈数作为变量控制赋值时区间, 并用while控制整体的大循环, 即循环多少圈
算法细节
1. n的奇偶
n为偶数可以直接填满矩阵, 若n为奇数最后还要填充中心位置
Code
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
matrix = [[0 for _ in range(n)] for _ in range(n)]
circle = 1
count = 0
while circle <= n // 2:
for i in range(circle - 1, n - circle):
count += 1
matrix[circle - 1][i] = count
for j in range(circle - 1, n - circle):
count += 1
matrix[j][n - circle] = count
for i in range(n - circle, circle - 1, -1):
count += 1
matrix[n - circle][i] = count
for j in range(n - circle, circle - 1, -1):
count += 1
matrix[j][circle - 1] = count
circle += 1
if n % 2 == 1:
count += 1
matrix[n//2][n//2] = count
return matrix