1. 程式人生 > 實用技巧 >每日一題:二分查詢

每日一題:二分查詢

二分查詢有很多細節的問題

框架是while 加 if

細節在於退出while迴圈的條件,

空區間,值不存在特殊情況會返回什麼。

1.建議對於所有區間使用左閉右開的習慣,即[ left , right ),結束時left一定與right重合

2.取中點時小心值溢位。

學習自知乎 https://www.zhihu.com/question/36132386?sort=created

核心思想是三個區間[ left0,left) [left,right) [ right, right0)

while迴圈時始終滿足

1. 搜尋區間[ left, right )不為空 。

2. 搜尋區間[ left0 , left )所有元素小於 target

3. 搜尋區間[ right, right0) 所有元素大於等於 target

\

最終 left == right, 左邊區間中所有值小於 target ,右邊區間中所有值大於等於target。

因此返回 left 下標,就是返回第一個出現的target 或者第一個比 target 大的數

一、target左邊界的二分查詢

int binary( int [] sums, target )
   { int left = 0;
      int right = sums.length;
      while( left<right )
        {mid = left + (right - left) /2
; if (sums[mid] < target) left = mid + 1; else right = mid ; } return left; }