【夢溪筆談】4.leetCode筆記
阿新 • • 發佈:2020-11-04
【滑動視窗】
通過兩個同向滑動的指標來控制視窗大小。
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])