基本搜尋演算法 二分搜尋法 Binary Search_Leetcode 704

更新於 2024/09/21閱讀時間約 6 分鐘
raw-image

這題的題目在這:

題目會給我們一個排序好的陣列,還有一個目標值target

要求我們在陣列中尋找target所在的索引位置。
如果target 不存在,返回-1

題目要求必須在O( log n )對數時間內完成 。


測試範例:

Example 1:

Input: nums = [-1,0,3,5,9,12], target = 9
Output: 4
Explanation: 9 exists in nums and its index is 4

Example 2:

Input: nums = [-1,0,3,5,9,12], target = 2
Output: -1
Explanation: 2 does not exist in nums so return -1

約束條件:

Constraints:

  • 1 <= nums.length <= 104
  • -104 < nums[i], target < 104
  • All the integers in nums are unique.
  • nums is sorted in ascending order.

演算法:

其實各家課本或教材都大同小異,都是從剖半找中心點的方式去搜索。

如果中心點 = target,代表已經找到了,就返回中心點。

如果中心點 < target,代表現在的值還太小,就收縮左邊界,往右邊尋找。

如果中心點 > target,代表現在的值還太大,就收縮右邊界,往左邊尋找。

如果最後找不到,就返回-1

但是有幾個小細節要留意:

  1. 中心點尋找時,使用比較安全的計算方式
    中心點 = 左端點 + (右端點-左端點) 除以 2,避免overflow

尤其是靜態型別語言,例如C, C++的同學要特別留意。

mid = left + (right - left ) // 2
  1. 可以額外做一個小優化optimization,當target已經落在搜尋範圍[left, right]之外時,提早終止不必要的搜尋分支
   if not (nums[left] <= target <= nums[right]):
    # optimization, early stop unnecessary branch
    return-1

程式碼:

Iterative method 迭代法:

class Solution:
 def search(self, nums: List[int], target: int) -> int:

  left, right = 0,len(nums)-1

  while left <= right:

   if not (nums[left] <= target <= nums[right]):
    # optimization, early stop unnecessary branch
    return-1

   mid = left + ( right - left ) // 2

   if( nums[mid] == target):
    return mid

   elif nums[mid] < target:
    left = mid+1
   
   else:
    right = mid-1

  return -1

Recursive method 遞迴法:

class Solution:
 def search(self, nums: List[int], target: int) -> int:
  
  def binary_search(nums, left, right, target ):
   
   if left > right:
    # base case:
    # miss
    # target does not exist in input array
    return -1

   if not (nums[left] <= target <= nums[right]):
    # optimization, early stop unnecessary branch
    return -1   

# update index of mid point
   mid = left + (right-left)//2

   if nums[mid] == target:

    # base case:
    # hit
    return mid

   if target > nums[mid]:
    
    # search target in right half
    return binary_search(nums, mid+1, right, target)

   else:

    # search target in left half
    return binary_search(nums, left, mid-1, target)

  #---------------------------
  return binary_search(nums, 0, len(nums)-1, target)

時間複雜度:

O( log n ) , 可以從 T(n) = T(n/2) + O(1) 用Master Theorem推導而來

空間複雜度:

迭代法為O(1),相當於指使用雙指針double pointers,所耗費的空間成本固定,為常數級別O(1)

遞迴法為O( log n),成本來自於recursion call stack depth 遞迴呼叫堆疊深度


Reference:

[1] Python/JS/Go/C++ log( n ) sol. by divide-and-conquer. [ With explanation ] - Binary Search - LeetCode

avatar-img
90會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
題目會給我們一個輸入陣列candidates,和一個目標值 target 問我們,從canditdates裡面重複挑選,可以湊出總和為target目標值的組合數有幾種? 在此,我們將使用找零錢II的DP模型和化簡的技巧來解題。
在經過比較簡單的入門題(Coin Change)之後, 來看進階一點的DP題目Coin Change II 整零錢的全部方法數。 不免俗,再次強調DP的解題框架,鞏固知識點。
深入淺出,從最基本的 費式數列, 一探動態規劃的奧秘與精隨。
題目會給定我們兩個字串,一個字串s,另一個字串t 要求我們判段字串s是否為字串t的子序列? (也就是s的每個字元都可以在t裡面找到,而且前後相對順序相同)
題目會給定我們一個二維矩陣,矩陣裡面的1代表一位士兵, 每個row裡面,row裡面士兵的總和就代表這條row的戰鬥力。 題目定義戰鬥力比較的規則: 士兵少的row戰鬥力比較小。 若有兩條row的戰鬥力相等, 則row index比較小的那條row,戰鬥力比較小。 請選出,前k個戰鬥力最弱的row
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
題目會給我們一個輸入陣列candidates,和一個目標值 target 問我們,從canditdates裡面重複挑選,可以湊出總和為target目標值的組合數有幾種? 在此,我們將使用找零錢II的DP模型和化簡的技巧來解題。
在經過比較簡單的入門題(Coin Change)之後, 來看進階一點的DP題目Coin Change II 整零錢的全部方法數。 不免俗,再次強調DP的解題框架,鞏固知識點。
深入淺出,從最基本的 費式數列, 一探動態規劃的奧秘與精隨。
題目會給定我們兩個字串,一個字串s,另一個字串t 要求我們判段字串s是否為字串t的子序列? (也就是s的每個字元都可以在t裡面找到,而且前後相對順序相同)
題目會給定我們一個二維矩陣,矩陣裡面的1代表一位士兵, 每個row裡面,row裡面士兵的總和就代表這條row的戰鬥力。 題目定義戰鬥力比較的規則: 士兵少的row戰鬥力比較小。 若有兩條row的戰鬥力相等, 則row index比較小的那條row,戰鬥力比較小。 請選出,前k個戰鬥力最弱的row
題目會給定一個字串,要求我們計算,最長的不重複區間有多長? 不重複區間的定義,就是區間內的每個字元都不相同。
你可能也想看
Google News 追蹤
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
林心雅,34歲,是一家國際知名企業的網路行銷主管。她才華橫溢,思維敏捷,善於用精確的語言和行動實現目標。她深信溝通的力量能改變世界,這不僅在她的職場中發揮了作用,也讓她在社會議題上擁有了堅定的立場,特別是在性別平等問題上。這天晚上,林心雅結束了一天忙碌的工作,回到家,泡了一杯熱茶後,她坐
2024.08.16 中央社張璦 主計總處今天公布2023年每人可支配所得中位數增至新台幣34.9萬元,牽動以此為調整基礎的納保法「基本生活費」,擬提高7000元至20.9萬元,明年5月報稅適用,屆時多口之家可望有感減稅。 納稅者權利保護法2017年底上路,保障國家不可對民眾維持基本生活所需費用
Thumbnail
宥爸認為在開始理財之前 最好先建立好基本的財商觀念 所以宥爸會先分享幾個理財心法給大家 宥爸最早接觸理財觀念是高中時 在圖書館裡看到的一本書 {富爸爸與窮爸爸} 相信很多人有看過這本書, 裡面讓宥爸印象最深刻的是 資產與負債 書中說道我們只要不斷擁有更多資產 減少負債的支出 最終
Thumbnail
教育部閩南語常用詞辭典提供了基本的查詢方式,包括頭字、尾字、字元等方式,使用漢字和拼音做例子,並講解了各種查詢方式的使用方法。
Thumbnail
題目會給我們一個排序好的陣列,還有一個目標值target 要求我們在陣列中尋找target所在的索引位置。 如果target 不存在,返回-1 題目要求必須在O( log n )對數時間內完成 。
Thumbnail
什麼是我們生命豐盛的關鍵? 基督徒的生命在追求些什麼? 驅動生命成長的動力是什麼? 聽聽主耶穌的大弟子彼得如何回答這些問題。
Thumbnail
關於基本薪資和績效獎金,賺哪個才划算? 對於快手而言,雖然採快可以多賺獎金,但是如果沒有拿捏好時數與獎金之間的平衡,其實虧的反而是自己;對公司方而言,採手採得越快,他們省下的人事成本則是越多。 不是賺獎金不可以,只是再賺績效獎金的時候,不要忘記基本時數才是根本,以免造成因小失大,捨本逐末的情形發生。
Thumbnail
STEP 1 :洞察消費需求,擬訂行銷策略—以均一價百貨為例 「價格」決定店面經營型態與商品含金量多寡,以平價百貨生活用品店為例,可分成兩種經營型態:「均一價」(例如所有商品 39 元)與「平價」(強調便宜,但不標榜均一價)。 對於平價百貨通路企畫人員而言,這兩種經營型態到底有何不同?
Thumbnail
現在大家生活條件好了,口袋裏的錢也越來越多,自然會關注自己的身體狀況,希望有強健的體魄去享受生活,一年一度的基本身體檢查也是少不了的,甚至有很多人為了高品質體驗,會選擇赴港體檢。那香港醫療機構一般可以做哪些基本身體檢查呢?到哪預約好? 1、基本身體檢查專案 大部分香港醫療機構的基本身體檢查專案較為
Thumbnail
通常在賽道上我最常遇到的提問是:xx彎要怎麼過? 當然不同的彎道有不同的處理方式,雖然賽道上我們追求的是時間,但同樣的方式應用在街道上也能得到安全順暢的駕駛效果 轉角處理的基本三大原則: 充分減速:減速到什麼程度依照彎道類型和實際訴求而定,賽道上大致上就是「能夠全速衝進彎道並瞄準apex」的程度 積
Thumbnail
*合作聲明與警語: 本文係由國泰世華銀行邀稿。 證券服務係由國泰世華銀行辦理共同行銷證券經紀開戶業務,定期定額(股)服務由國泰綜合證券提供。   剛出社會的時候,很常在各種 Podcast 或 YouTube 甚至是在朋友間聊天,都會聽到各種市場動態、理財話題,像是:聯準會降息或是近期哪些科
Thumbnail
林心雅,34歲,是一家國際知名企業的網路行銷主管。她才華橫溢,思維敏捷,善於用精確的語言和行動實現目標。她深信溝通的力量能改變世界,這不僅在她的職場中發揮了作用,也讓她在社會議題上擁有了堅定的立場,特別是在性別平等問題上。這天晚上,林心雅結束了一天忙碌的工作,回到家,泡了一杯熱茶後,她坐
2024.08.16 中央社張璦 主計總處今天公布2023年每人可支配所得中位數增至新台幣34.9萬元,牽動以此為調整基礎的納保法「基本生活費」,擬提高7000元至20.9萬元,明年5月報稅適用,屆時多口之家可望有感減稅。 納稅者權利保護法2017年底上路,保障國家不可對民眾維持基本生活所需費用
Thumbnail
宥爸認為在開始理財之前 最好先建立好基本的財商觀念 所以宥爸會先分享幾個理財心法給大家 宥爸最早接觸理財觀念是高中時 在圖書館裡看到的一本書 {富爸爸與窮爸爸} 相信很多人有看過這本書, 裡面讓宥爸印象最深刻的是 資產與負債 書中說道我們只要不斷擁有更多資產 減少負債的支出 最終
Thumbnail
教育部閩南語常用詞辭典提供了基本的查詢方式,包括頭字、尾字、字元等方式,使用漢字和拼音做例子,並講解了各種查詢方式的使用方法。
Thumbnail
題目會給我們一個排序好的陣列,還有一個目標值target 要求我們在陣列中尋找target所在的索引位置。 如果target 不存在,返回-1 題目要求必須在O( log n )對數時間內完成 。
Thumbnail
什麼是我們生命豐盛的關鍵? 基督徒的生命在追求些什麼? 驅動生命成長的動力是什麼? 聽聽主耶穌的大弟子彼得如何回答這些問題。
Thumbnail
關於基本薪資和績效獎金,賺哪個才划算? 對於快手而言,雖然採快可以多賺獎金,但是如果沒有拿捏好時數與獎金之間的平衡,其實虧的反而是自己;對公司方而言,採手採得越快,他們省下的人事成本則是越多。 不是賺獎金不可以,只是再賺績效獎金的時候,不要忘記基本時數才是根本,以免造成因小失大,捨本逐末的情形發生。
Thumbnail
STEP 1 :洞察消費需求,擬訂行銷策略—以均一價百貨為例 「價格」決定店面經營型態與商品含金量多寡,以平價百貨生活用品店為例,可分成兩種經營型態:「均一價」(例如所有商品 39 元)與「平價」(強調便宜,但不標榜均一價)。 對於平價百貨通路企畫人員而言,這兩種經營型態到底有何不同?
Thumbnail
現在大家生活條件好了,口袋裏的錢也越來越多,自然會關注自己的身體狀況,希望有強健的體魄去享受生活,一年一度的基本身體檢查也是少不了的,甚至有很多人為了高品質體驗,會選擇赴港體檢。那香港醫療機構一般可以做哪些基本身體檢查呢?到哪預約好? 1、基本身體檢查專案 大部分香港醫療機構的基本身體檢查專案較為
Thumbnail
通常在賽道上我最常遇到的提問是:xx彎要怎麼過? 當然不同的彎道有不同的處理方式,雖然賽道上我們追求的是時間,但同樣的方式應用在街道上也能得到安全順暢的駕駛效果 轉角處理的基本三大原則: 充分減速:減速到什麼程度依照彎道類型和實際訴求而定,賽道上大致上就是「能夠全速衝進彎道並瞄準apex」的程度 積