来源:力扣(LeetCode)
长度最小的子数组
链接:
https://leetcode.cn/problems/minimum-size-subarray-sum/
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
n=len(nums)
ans=n+1
sum=0
start,end=0,0
while end<n:
sum+=nums[end]
while sum>=target:
ans=min(ans,end-start+1)
sum-=nums[start]
start+=1
end+=1
return 0 if ans==n+1 else ans
思路:
本题我采用最简单和不会超时长的滑动窗口。理解题意:本题要求找连续的子数组,满足两个条件:1、这个子数组的元素和>=target ,2、长度最小。首先,我们考虑两种极端情况:1、数组为空;2、数组全部元素和小于target。所以定义一个变量“ans=n+1”,在最后判断一下ans,如果还是n+1,说明遍历完没有找到一个子数组的和>=target,同时解决两种极端情况。注意“ans”主要是为了记录子数组长度而存在的。其次,我们再定义“start、end”双指针用来索引子数组第一位和最后一位和“sum”记录子数组的元素和。最后,当“end<n”开始遍历,我们使用sum记录和,判断一下sum是否>=target,当不满足条件时,将“end+=1”;直到满足sum>=target这个条件时,开启循环寻找最小的子数组长度。我们取“ans”和“end-start+1”的最小值,由于我们此时已经记录了子数组的长度,所以我们需要将“start+=1”,此时子数组不包含nums[start]的值,所以要在start+1前将sum-nums[start]的值;
螺旋矩阵 II
链接:
https://leetcode.cn/problems/spiral-matrix-ii/
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
dirs=[(0,1),(1,0),(0,-1),(-1,0)]
matrix=[[0]*n for _ in range(n)]
dirIdx,row,col=0,0,0
for i in range(n*n):
matrix[row][col]=i+1
dx,dy=dirs[dirIdx]
r,c=row+dx,col+dy
if r<0 or r==n or c==n or matrix[r][c]>0:
dirIdx=(dirIdx+1)%4
dx,dy=dirs[dirIdx]
row,col=row+dx,col+dy
return matrix
思路:
题目理解:本题需要构建一个n x n
正方形矩阵,将元素按顺时针顺序螺旋排列。主要解决两个方面:1、怎么按照顺时针螺旋行走;2、怎么防止超越边界。解题:首先,我们需要构建一个n x n
元都为0的矩阵,向里面填元素。其次,我们填元素是一个一个填所以遍历次数是n x n
,定义初始点坐标“row,col=0,0”。我们一初始点向右为x轴正向,向下为y轴正向。定义一个列表存储四个行走方向按照→、↓、←、↑排列,定义“dirIdx=0”初始向右走。最后,我们在循环里将矩阵对应位置进行赋值,然后我们判断一下,当走到最后一行或列的时候我们要转弯,走到以前填过元素的地方要转弯。注意:“r<0”是因为第一列的行数为0,所以这边不能直接为“r=0”。
本文为学习算法的小白发布,不喜勿喷