704. Binary Search

704. Binary Search

# Approach. Binary Search
# Time Complexity: O(log n)
# Space Complexity: O(1)
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if len(nums) == 0:
            return -1
        left_index = 0
        right_index = len(nums) - 1
        while left_index <= right_index:
            middle_index = (left_index + right_index) // 2
            if nums[middle_index] < target:     # right part
                left_index = middle_index + 1
            elif nums[middle_index] > target:   # left part
                right_index = middle_index - 1
            else:   # found
                return middle_index

        return -1

Notes:

程式流程

  • 因為題目中提到nums是一個遞增陣列,所以可以用binary search 找到解 (如果存在),而binary search 的 time complexity為 O(log n)
  • Pseudo-code
    left_index = 0 # 初始化左邊的index
    right_index = length - 1 # 初始化右邊的index (因為array的index 0開始,所以right_index為長度減1)
    while left_index <= right_index : # 跑迴圈,直到 left_index > right_index離開,表示沒找到target
        middle_index = (left + right) // 2
        middle = nums[middle_index)
        若中間值(middle)小於target -> target在右半邊, left_index = middle_index + 1
        若中間值(middle)大於target -> target在左半邊, right_index = middle_index -1
        若前兩個條件都不成立,表示middle等於target -> 找到target,return middle_index
    若離開while loop都沒回傳結果,表示沒找到target,return -1

紀錄

  • 5分鐘 : 了解題目 (assumptions、work through examples, function signature)
  • 2-3分鐘 : 考慮brute force solution (O(n)),已知陣列是遞增且排序,不可能用暴力解法,所以並未實作,並根據題目給的條件,應該用binary search的方式實作(O(log n))
  • 15分鐘寫下pseudo code,並轉成Python code,舉幾個例子用手寫(模擬)的方式跑過一次程式碼
  • 5分鐘:把手寫的程式碼輸入Leetcode並執行

 

備註

  • 在第一次模擬程式執行過程中,發現我的第一版程式有bug,while loop的條件應該是 left <= right,但是我寫成left < right
  • 難度上來說,介於過於簡單跟難度適中之間,因為第一版有bug,表示我一開始並未考慮到所有情況,所以選擇難度適中

Leave a Reply