【滑动窗口】
通过两个同向滑动的指针来控制窗口大小。
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])