目录
209. 长度最小的子数组
思路:
1.滑动窗口,窗口长度最小值即为答案
2.看到排序完了的数组,喜之
3.首先判断是否为空数组,空数组直接返回0
4.设置左右窗口为0,0并设置初始ans为一个取不到的数比如n+1 n为数组长度,这样可以用于判断是否能够满足题意
5.每次循环时,窗口向右移动,总和加上右边的值,循环条件是又边界小于数组的长度。
6.循环的时候进行判断,如果当前的总和大于等于target,进入嵌套循环,这个循环的目的是将窗口左端右移来找窗口的最小值,每次循环的时候,先比较当前窗口长度和ans的大小,取较小值作为ans,然后减去左边的值且左端右移
7.循环结束判断ans 如果ans为n+1说明无法满足,返回0,其他情况返回ans
代码:
class Solution:
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
# 滑动窗口
if not nums:
return 0
left, right = 0, 0
n = len(nums)
ans = n + 1 # 这里设置一个较大的无法达到的值作为检测
s = 0 # 为什么这里初始是0 ?
while right < n:
s += nums[right]
while s >= target:
ans = min(ans, right - left + 1)
s -= nums[left]
left += 1
right += 1
return 0 if ans == n + 1 else ans
611.有效的三角形个数
思路:
1.列表未排序,先对列表进行排序才方便后续操作
2.选用双指针,可以以O(nlogn)的时间复杂度完成本题
3.设置一个ans储存答案个数。在列表中先固定一个值,第一个值从列表的第一个值开始取,第二个值放在第一个值之后,第三个值第二个值之后开始取,先动第三个指针,第三个指针对应的第一个值都不满足三角形,那么直接结束内层循环,因为后续的值会更大,更加无法满足三角形条件,结束后将第二个指针向后移动,依次循环
代码:
class Solution:
def triangleNumber(self, nums: List[int]) -> int:
# 这题一定需要排序
nums.sort()
n = len(nums)
ans = 0
# i j k 顺着来就好 从小往大 不要用对撞
for i in range(n):
k = i + 1 # 写在下一个循环里面会超时卧槽
for j in range(i+1, n):
while k + 1 < n and nums[i] + nums[j] > nums[k + 1]:
# 这里是k+1因为是要下一个满足再移动
k += 1
ans += max(0, k-j)
return ans
反思:
两道题,都说是二分查找,结果都没有用到二分查找
淦
以上
坚持 共勉