1. 程式人生 > 實用技巧 >【夢溪筆談】4.leetCode筆記

【夢溪筆談】4.leetCode筆記

【滑動視窗】
通過兩個同向滑動的指標來控制視窗大小。
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])