日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

LeetCode 常用方法

發布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LeetCode 常用方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

記錄下LeetCode中常用的方法。

目前有:二分,回溯。

二分查找:?

?二分查找模板_一只大鴿子的博客-CSDN博客

?作者:labuladong
鏈接:https://leetcode-cn.com/problems/binary-search/solution/er-fen-cha-zhao-xiang-jie-by-labuladong/
來源:力扣(LeetCode)

?原文解釋的很好,推薦閱讀。二分查找的細節就是while 條件是< 還是 <=,更新right=mid還是mid+1,可以用區間開閉來理解。

while left < right 意味著 搜索區間是 [left,right)左閉右開,

while left <= right 意味著 搜索區間是 [left,right]左閉右閉。

這個搜索空間也決定了后面的更新。以左邊界為例,如果使用 left<=right閉區間形式,

初始化left,right = 0,len(nums)-1? 對應[0,len(nums)-1]

那么 nums[mid]? > target 時,right = mid-1,搜索區間變為[left,mid-1]?

????????nums[mid] == target時,right = mid-1,搜索區間為[left,mid-1],繼續向左壓縮。

????????nums[mid] <? ?target時,left = mid+1,? ? 搜索空間為[mid+1,right]。

而如果使用 left< right 左閉右開形式,初始化left,right = 0,len(nums)? 對應[0,len(nums))

nums[mid] >? target 時 ,? right = mid,搜索區間變為[left,mid)

nums[mid] == target時,right = mid,搜索區間為[left,mid),繼續向左壓縮。

nums[mid] <? target時,?left = mid+1,? ?搜索空間為[mid+1,right)。

二分查找模板

包括:二分查找目標值,左邊界,右邊界。(Python版本)

直接查找目標值很簡單,

nums[mid]<target,壓縮左邊 left = mid +1

nums[mid]>target,壓縮右邊 right = mid -1

nums[mid]==target , 返回 mid

查找左邊界的前兩部分類似,但nums[mid]==target時要繼續壓縮右邊界,鎖定左邊界,最后返回左邊界。注意處理越界情況。

查找右邊界同理。

class Solution:#二分查找目標值def binary_search(self,nums: List[int], target: int) -> int:left, right = 0, len(nums) - 1while left <= right:mid = left + (right - left) // 2if nums[mid] < target:left = mid + 1elif nums[mid] > target:right = mid - 1elif nums[mid] == target:return midreturn -1#左邊界def left_bound(self,nums: List[int], target: int) -> int:left, right = 0, len(nums) - 1while left <= right:mid = left + (right - left) // 2if nums[mid] < target:left = mid + 1elif nums[mid] > target:right = mid - 1elif nums[mid] == target:right = mid -1if left >= len(nums) or nums[left] != target:return -1return left#右邊界def right_bound(self,nums: List[int], target: int) -> int:left, right = 0, len(nums) - 1while left <= right:mid = left + (right - left) // 2if nums[mid] < target:left = mid + 1elif nums[mid] > target:right = mid - 1elif nums[mid] ==target:left = mid + 1if right < 0 or nums[right] != target:return -1return right

回溯

回溯算法入門級詳解 + 練習(持續更新) - 全排列 - 力扣(LeetCode) (leetcode-cn.com)

回溯法 采用試錯的思想,它嘗試分步的去解決一個問題。在分步解決問題的過程中,當它通過嘗試發現現有的分步答案不能得到有效的正確的解答的時候,它將取消上一步甚至是上幾步的計算,再通過其它的可能的分步解答再次嘗試尋找問題的答案。回溯法通常用最簡單的遞歸方法來實現,在反復重復上述的步驟后可能出現兩種情況:

  • 找到一個可能存在的正確的答案;
  • 在嘗試了所有可能的分步方法后宣告該問題沒有答案。

簡單來說,回溯法通過遞歸(深度優先遍歷dfs)來分步解決問題。在每一步的嘗試中,可能取消上一步的操作。

39. 組合總和 - 力扣(LeetCode) (leetcode-cn.com)

46. 全排列 - 力扣(LeetCode) (leetcode-cn.com)

#回溯 題39 class Solution:def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]:def dfs(target,ans,combine,idx):if idx == n:returnif target == 0:ans.append(list(combine))return#跳過idxdfs(target,ans,combine,idx+1)#選擇idxif target-candidates[idx] >= 0:combine.append(candidates[idx])dfs(target-candidates[idx],ans,combine,idx)combine.pop()n = len(candidates)ans = []combine=[]dfs(target,ans,combine,0)return ans

可以抽象為:

def dfs(目標target,狀態,臨時答案tmpans,ans):if 終止條件:return #結束if 滿足條件target:添加tmpans到ansreturn #結束做出選擇dfs(選擇后的狀態)撤銷選擇

總結

以上是生活随笔為你收集整理的LeetCode 常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。