二分查找的索引問題
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【算法】雜項
[
13 瀏覽
1 評論
2 贊
2 踩
]
概要
正文
在二分查找時,需要注意一下索引問題。
例如對於 [0,0,0,0,1,1,1,1,1,1,1] 要找出值爲 1 的最小下標,找出值爲 0 的最大下標,那麼應該:
int left = 0, right = arr_size - 1; while (left <= right) { int mid = left + (right - left) / 2; if (arr[mid] == 1) { right = mid-1; } else { left = mid+1; } } int max_idx_0 = right; int min_idx_1 = left;
注意事項:
最好不要每次循環 right = mid, left = mid(沒有 +- 1),這樣會導致最後 left 和 right 不交叉,判定更麻煩
結束的時候肯定是 right = left - 1,且 right 是 0 值的最大下標,left 是 1 值的最小下標
證明:由於 arr[mid] == 0 纔會 left = mid+1,arr[mid] == 1 纔會 right = mid-1,因此在最後一兩次循環之前,arr[left]~arr[right] 內部都是包含 01 分界點的。只需要對最後區間長度爲 2,3,4 的幾種情況單獨研究一下就會發現,最終結果一定是這樣的。
評論區
1 條評論
+ 添加評論
#1
無
[引用]
郵箱 無
|
int
left
;
int
right
;
left = 0;
right = arr_size - 1;
while
(left <= right)
{
int
mid = left + (right - left) / 2;
if
(arr[mid] == 1)
{
right = mid-1;
}
else
{
left = mid+1;
}
}
int
max_idx_0
;
int
max_idx_1
;
max_idx_0 = right;
max_idx_1 = left;
语句块,无论里面多少句,就算是只有一句,也请加上花括弧,那样容易阅读。请注意,代码首先是用来阅读的,不是用来执行的,否则就直接用汇编好了。
上面仅供参考,体依个人习惯。重要的是,方便日后阅读维护。
+ 添加評論