# 【LeetCode刷題】【演算法學習筆記】 704. Binary Search * 學習時間:2025/01/25(Sat.)- 1/27 (Mon.) * **題目連結(美服):**[704. Binary Search](https://leetcode.com/problems/binary-search/editorial/) * **題目連結(國服):** [704. 二分查找](https://leetcode.cn/problems/binary-search/description/) * Reference: [代碼隨想錄](https://github.com/youngyangyang04/leetcode-master/blob/master/problems/0704.二分查找.md) [Neetcode](https://www.youtube.com/watch?v=s4DPM8ct1pI) ### A. 解題技術點 --- 1. [陣列(Array)](https://hackmd.io/@oliver-jhih-cs/ryO4s7MdJe) 2. [二分搜尋法(Binary Search)](https://hackmd.io/@oliver-jhih-cs/rJI1aXz_yg) 3. [時間複雜度(Time Complexity)](https://medium.com/appworks-school/初學者學演算法-從時間複雜度認識常見演算法-一-b46fece65ba5) ### B. 題目 --- * Given an array of integers ==nums== which is sorted in ascending order, and an integer ==target==, write a function to search ==target== in nums. If ==target== exists, then return its **index**. Otherwise, return **-1**. > * You must write an algorithm with **O(log n)** runtime complexity. ### C. 題意(中文) --- > 給定一個升序排序(從小到大排列)的整數陣列 nums,以及一個整數目標值 target,請你撰寫一個函式來在這個陣列中尋找目標值。 1. 如果 target 存在於陣列中,回傳它的索引值(**index**)。 2. 如果 target 不存在,回傳 **-1**。 3. 要求:演算法時間複雜度為 **O(log n)** ### D. 參考程式碼 --- :::spoiler Solution (題解) ``` python3 from typing import List class Solution: def search(self, nums: List[int], target: int) -> int: # Initialize two pointers l, r = 0, len(nums) - 1 # Binary search while l <= r: # Calculate the middle index mid = l + (r - l) // 2 if nums[mid] > target: r = mid - 1 elif nums[mid] < target: l = mid + 1 else: return mid # Found target return -1 # Target not found ``` ::: :::spoiler Note(筆記) 1. **Binary Search Basic** * It works only on sorted (已排序的) arrays. * The idea (方法) is divide (分割) the search range in half reapetedly (反覆). 2. **Logic Breakdown (邏輯分解)** * Check the **middle value** (中間值) (**nums[mid]**) * If it **matches** the target, return the ==index==. * If it's **smaller**, the target must be in the right half, so mid move ==left==. * If it's **larger**, the target must be in the left half, so mid move ==right==. 4. **Efficiency (效率)** * Time complexity: **O(log n)** because the search range is halved (一半) at each step. * Space complexity: **O(1)** Since no extra (額外的) space is used.