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 常用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数模】模糊综合评价模型
- 下一篇: SQL Server 置疑修复