二分搜索

//非遞減數列,[left, right] 閉區間,最後left一定會等於right
while(left < right) {//區間只剩1個元素時終止,此時left=right
    int mid = left + ((right - left) >> 1);//防止溢出,沒有+1,mid偏左
    if(target > nums[mid]) {
        left = mid + 1;//因爲mid已經偏左,left+1可防止死循環
    }
    else {//包含“相等”的條件在裏面,不單獨列出“相等”是因爲比較操作會耗時,二分搜索(而不是三分四分)只需一個比較操作
        right = mid;
    }
}
//nums[right] >= target,right是第一個大於等於target的數
//非遞減數列,[left, right] 閉區間,最後left一定會等於right
while(left < right) {//區間只剩1個元素時終止,此時left=right
    int mid = left + ((right - left + 1) >> 1);//防止溢出,存在+1,mid偏右
    if(target < nums[mid]) {
        right = mid - 1;//因爲mid已經偏右,right-1可防止死循環
    }
    else {//包含“相等”的條件在裏面,不單獨列出“相等”是因爲比較操作會耗時,二分搜索(而不是三分四分)只需一個比較操作
        left = mid;
    }
}
//nums[left] <= target,left是最後一個小於等於target的數
發佈了98 篇原創文章 · 獲贊 41 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章