匯東網


二分查找的索引問題

[編輯] [转简体]
|
作者: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;


注意事項:

  1. 最好不要每次循環 right = mid, left = mid(沒有 +- 1),這樣會導致最後 left 和 right 不交叉,判定更麻煩

  2. 結束的時候肯定是 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 的幾種情況單獨研究一下就會發現,最終結果一定是這樣的。


[ 2] [ 2]


 評論區  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;


语句块,无论里面多少句,就算是只有一句,也请加上花括弧,那样容易阅读。请注意,代码首先是用来阅读的,不是用来执行的,否则就直接用汇编好了。

上面仅供参考,体依个人习惯。重要的是,方便日后阅读维护。



+ 添加評論