力扣209长度最小的数组
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
if not nums:#如果nums中没有元素,那么nums=NONE要考虑
return 0
a=0
b=0
lennums=len(nums)
ans=lennums+1#可能出现数组中所有元素相加刚好大于target的情况
sumnums=0
while b<lennums:
sumnums+=nums[b]
while sumnums>=target:
ans=min(ans,b-a+1)
sumnums-=nums[a]
a+=1
b+=1
return 0 if ans==lennums+1 else ans#如果ans与lennums+1相等则说明没有找到大于target的子数组
if not nums:#如果nums中没有元素,那么nums=NONE要考虑
return 0
1.现实中可能要考虑给定的数组nums不存在元素的情况,所以首先判断,但是题目中明确说明nums.length>=1,所以不需要考虑,去掉也可AC。
return 0 if ans==lennums+1 else ans
2.结尾要考虑返回值,如果结束循环了ans的返回值与没参与循环相同,那么返回值为0,否则返回值ans
3.看到题目计算满足条件的最短数组,思路逐渐向滑动窗口靠近。但是滑动窗口不同于双指针,因为滑动窗口拥有“窗口值”,也就是代码中的sumnums,这个值是测试“窗口”是否满足条件的关键因素。“滑动”是指根据sumnums值与target的值的比较,最终计算出左右边界a、b。还要注意一点就是在大算法题目中,适当积累min(x,y)函数,节省时间和思维。
力扣59螺旋矩阵
class Solution:
def generateMatrix(self, n: int) -> List[List[int]]:
matrix=[[0]*n for _ in range(n)]#n行n列简便设置
starti=0
startj=0
loop,mid=n//2,n//2
count=1
a=1
for offset in range (1,loop+1):
for j in range(startj,n-offset,1):
matrix[starti][j]=a
a+=1
for i in range(starti,n-offset,1):
matrix[i][n-offset]=a
a+=1
for j in range(n-offset,startj,-1):
matrix[n-offset][j]=a
a+=1
for i in range(n-offset,starti,-1):
matrix[i][startj]=a
a+=1
starti+=1
startj+=1
if n%2==1:
matrix[mid][mid]=a
return matrix
1.看到题目直觉开始模拟每一圈由四次递增做成,上右下左,但是对于向内的细节考虑不周。由于题目中给的是n=3,很容易模拟出一圈的变化。但是如果n=5,将要考虑向内螺旋的过程。所以不要仅仅模拟范例,要广泛思考。第一遍做的时候没有考虑每次循环递增的量offset。看到《代码随想录》的示例(如上),我在想为什么要使用offset和loop两个变量,这完全是一个值。(因为我控制大循环就是使用一个layer在逐渐递减……)。事实上,我们对于循环的每一圈来看它的“正方形”都是在不断缩小,所以需要控制它的大小就需要减去一个逐渐递增的值->offset,但是要对这个增值有所约束,毕竟不像递减(while(layer>0))即可。
2.积累
matrix=[[0]*n for _ in range(n)]:python对于n行n列的简便做法
loop,mid=n//2,n//2:python不同于C,python使用 “/” 表示浮点数相除,3/2=1.5(python)
所以python使用“//”表示整除。