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

閱讀時間約 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

87會員
425內容數
由有業界實戰經驗的演算法工程師, 手把手教你建立解題的框架, 一步步寫出高效、清晰易懂的解題答案。 著重在讓讀者啟發思考、理解演算法,熟悉常見的演算法模板。 深入淺出地介紹題目背後所使用的演算法意義,融會貫通演算法與資料結構的應用。 在幾個經典的題目融入一道題目的多種解法,或者同一招解不同的題目,擴展廣度,並加深印象。
留言0
查看全部
發表第一個留言支持創作者!
題目會給我們一個輸入陣列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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
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
這個秋,Chill 嗨嗨!穿搭美美去賞楓,裝備款款去露營⋯⋯你的秋天怎麼過?秋日 To Do List 等你分享! 秋季全站徵文,我們準備了五個創作主題,參賽還有機會獲得「火烤兩用鍋」,一起來看看如何參加吧~
Thumbnail
11/20日NVDA即將公布最新一期的財報, 今天Sell Side的分析師, 開始調高目標價, 市場的股價也開始反應, 未來一週NVDA將重新回到美股市場的焦點, 今天我們要分析NVDA Sell Side怎麼看待這次NVDA的財報預測, 以及實際上Buy Side的倉位及操作, 從
Thumbnail
Hi 大家好,我是Ethan😊 相近大家都知道保濕是皮膚保養中最基本,也是最重要的一步。無論是在畫室裡長時間對著畫布,還是在旅途中面對各種氣候變化,保持皮膚的水分平衡對我來說至關重要。保濕化妝水不僅能迅速為皮膚補水,還能提升後續保養品的吸收效率。 曾經,我的保養程序簡單到只包括清潔和隨意上乳液
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」的程度 積