【滑动窗口】
通过两个同向滑动的指针来控制窗口大小。
1.首先左右指针都为0,然后开始滑动右指针
2.把对应的值放到滑动窗口中,同时检查窗口中的值是否符合要求
3.当窗口中的值都符合要求时,开始滑动左指针
参考链接:https://mp.weixin.qq.com/s/ioKXTMZufDECBUwRRp3zaA
left,right=0,0
window,need={},{}
for i in s:
need[i]=0
valid=0
start=0
l=sys.maxsize
while(right<len(s)):
c=s[right]
right=right+1
if(need__contains__(c)):
window[c]=1
if(need[c]==window[c]):
valid=valid+1
while(valid==len(need)):
if(right-left<l):
start=left
l=right-left
o=s[left]
if(need__contains__(o)):
if(need[c]==window[c]):
valid=valid-1
window[c]=window[c]-1
return s[start,start+l]
【二分查找】
1.首先确定左右区间的闭开情况,可以都认为是闭区间,此时right=len(nums)-1
2.然后mid=left+(right-left)/2,防止溢出
3.while循环的条件是left<=right,因为当left>right时,已经超出了nums的边界。
参考:https://mp.weixin.qq.com/s?__biz=MzAxODQxMDM0Mw==&mid=2247485044&idx=1&sn=e6b95782141c17abe206bfe2323a4226&chksm=9bd7f87caca0716aa5add0ddddce0bfe06f1f878aafb35113644ebf0cf0bfe51659da1c1b733&scene=21#wechat_redirect
①、简单的二分查找
while(left<=right):
mid=mid=left+(right-left)/2
if(mid==target):return mid
elif(mid<target):
left=mid+1
elif(mid>target):
right=mid-1
②、左侧边界查找--找到目标后,别返回结果,先缩小右侧,直到左侧等于target
while(left<=right):
mid=left=(right-left)/2
if(mid==target):
right=mid-1
elif(mid<target):
right=mid-1
elif(mid>target):
left=mid+1
if (left<0 or nums[left]!=target):
return -1
else:
return left
【动态规划】
1.首先明确状态是什么,也就是dp[i]中i的值
2.然后明确dp[i]的值,如果是dp[i],那么就是题目求的值,如果dp是一个函数,则是函数的返回,也差不多
3.然后观察dp[i]是怎么转移的,因为动态规划,当前的dp[i]是有dp[i-1]决定,也就是说最终结果是由一个个子状态构成
4.然后明确base case,也就是dp[0]等于多少,才能从0到i进行一步步迭代。
参考:https://mp.weixin.qq.com/s/RXfnhSpVBmVneQjDSUSAVQ
dp[0]=0
for i in range(len(nums)):
dp[i]=max(dp[i-1],nums[i]+dp[i])
res=0
for i in range(len(nums)):
res=max(res,dp[i])