977.
暴力法:整个数组平方,然后再nums.sort(),时间复杂度O(nlogn) 空间复杂度O(1)
双指针法:从两头开始遍历,l,r指向当前有可能的最大值,i象征着新数组对应的位置,从大到小,时间复杂度:O(n), 空间复杂度:O(n)
209.
暴力法:两层for循环,第一个是起始位置,第二个是终止位置,把所有数组的情况都遍历一遍,找到最小的数组长度
class Solution: def minSubArrayLen(self, target: int, nums: List[int]) -> int: if nums == None or len(nums) == 0: return 0 if nums[0] >= target: return 1 minimum = float("inf") for i in range(len(nums)): subarray_sum = 0 for j in range(i,len(nums)): subarray_sum += nums[j] if j - i < minimum and subarray_sum == target: minimum = j - i + 1 if minimum == float("inf"): return 0 else: return minimum
滑动窗口:类似于双指针,取两个指针中间的集合,所以叫滑动窗口
重点一:j指向终止位置,i起始位置动态移动——一个for循环的思路才能解决
重点二:【精华】如何移动起始位置
——当集合元素和>=s 说明符合条件,收集其长度后,i可以往后移动,缩小集合范围看下一个集合是否符合条件
result = float('inf') 先取最大值 之后才能取所有集合里的最小值
i=0
for(j=0,j<=nums.size-1,j++)
Sum+=nums[j]
Sum>=s 这里的逻辑是while 持续更新
subL=j-i+1
result = min(result,subL)
Sum=Sum-nums[i]
i++
class Solution: def minSubArrayLen(self, s: int, nums: List[int]) -> int: # 定义一个无限大的数 res = float("inf") Sum = 0 i = 0 for j in range(len(nums)): Sum += nums[j] while Sum >= s: res = min(res, j-i+1) Sum -= nums[i] i += 1 return 0 if res==float("inf") else res
59.螺旋矩阵
循环不变量:
[) 或者 [] 坚持一个原则,左闭右开 坚持到底
我们不去处理每条边的最后一个节点,把最后一个节点留给下一条边
这样转一圈,坚持左闭右开的原则,每一个点都会遍历到
每一条边的处理规则要统一——循环不变量
class Solution: def generateMatrix(self, n: int) -> List[List[int]]: nums = [[0] * n for _ in range(n)] startx, starty = 0, 0 # 起始点 loop, mid = n // 2, n // 2 # 迭代次数、n为奇数时,矩阵的中心点 count = 1 # 计数 for offset in range(1, loop + 1) : # 每循环一层偏移量加1,偏移量从1开始 for i in range(starty, n - offset) : # 从左至右,左闭右开 nums[startx][i] = count count += 1 for i in range(startx, n - offset) : # 从上至下 nums[i][n - offset] = count count += 1 for i in range(n - offset, starty, -1) : # 从右至左 nums[n - offset][i] = count count += 1 for i in range(n - offset, startx, -1) : # 从下至上 nums[i][starty] = count count += 1 startx += 1 # 更新起始点 starty += 1 if n % 2 != 0 : # n为奇数时,填充中心点 nums[mid][mid] = count return nums