每日一題:二分查詢
阿新 • • 發佈:2020-12-02
二分查詢有很多細節的問題
框架是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; }