↓快轉到主要內容
  1. LeetCode/

LeetCode 704: Binary Search

·1 分鐘· ·
LeetCode Easy Array Binary-Search
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: easy 第一次嘗試:2022-08-31

  • 提交紀錄:Accepted → Runtime Error ×3 → Accepted ×2 → Runtime Error → Accepted ×3

解題思路
#

標準的二分搜尋(Binary Search 模板一)。區間 [l, r] 兩端都包含,while l <= r:nums[mid] 太小就 l = mid + 1,太大就 r = mid - 1。

我的嘗試
#

幾次 RE 都是 mid = (l + r) / 2 得到浮點數拿來當 index(TypeError),或邊界算錯超出範圍。

正確解法
#

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        l, r = 0, len(nums) - 1
        while l <= r:
            mid = (l + r) // 2
            if nums[mid] == target:
                return mid
            if nums[mid] < target:
                l = mid + 1
            else:
                r = mid - 1
        return -1

複雜度
#

時間 O(log n),空間 O(1)。

要特別避免的錯誤
#

  • Python 3 的 / 會得到浮點數,index 要用 //。
  • 閉區間就配 while l <= r 和 mid ± 1。

面試口說整理
#

我用左閉右閉的區間二分,mid 比目標小就把左界移到 mid + 1,比目標大就把右界移到 mid - 1,找到就回傳。時間 O(log n)。

相關文章

LeetCode 268: Missing Number
·1 分鐘
LeetCode Easy Array Hash-Table Math Binary-Search
LeetCode 268 解題筆記:0 到 n 的總和減掉陣列總和就是缺的那個;缺的可能是 0
LeetCode 35: Search Insert Position
·1 分鐘
LeetCode Easy Array Binary-Search
LeetCode 35 解題筆記:找第一個 >= target 的位置(lower bound);半開區間 [l, r) 要配 r = mid,不能寫 r = mid - 1
LeetCode 349: Intersection of Two Arrays
·1 分鐘
LeetCode Easy Array Hash-Table Two-Pointers Binary-Search
LeetCode 349 解題筆記:兩個陣列各轉成集合取交集
LeetCode 350: Intersection of Two Arrays II
·1 分鐘
LeetCode Easy Array Hash-Table Two-Pointers Binary-Search
LeetCode 350 解題筆記:保留重複次數的交集,Counter 相交(&)取兩邊次數的較小值
LeetCode 705: Design HashSet
·1 分鐘
LeetCode Easy Array Hash-Table Linked-List Design
LeetCode 705 解題筆記:固定數量的桶子,key 對桶子數取餘數決定放哪一桶,每個桶子用 list 處理碰撞
LeetCode 674: Longest Continuous Increasing Subsequence
·1 分鐘
LeetCode Easy Array
LeetCode 674 解題筆記:掃一次,嚴格遞增就延長目前的長度,否則重設成 1,迴圈結束後也要更新最大值