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