日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

二分查找2

發布時間:2025/3/21 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二分查找2 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

二分查找法作為一種常見的查找方法,將原本是線性時間提升到了對數時間范圍,大大縮短了搜索時間,但它有一個前提,就是必須在有序數據中進行查找。

二分查找很好寫,卻很難寫對,據統計只有10%的程序員可以寫出沒有bug的的二分查找代碼。出錯原因主要集中在判定條件和邊界值的選擇上,很容易就會導致越界或者死循環的情況。

下面對二分查找及其變形進行總結:

1. 最基本的二分查找

public int binarySearch(int[] A, int target, int n){int low = 0, high = n, mid;while(low <= high){mid = low + (high - low) / 2;if(A[mid] == target){return mid;}else if(A[mid] > target){high = mid - 1;}else{low = mid + 1;}}return -1; }

其中,有幾個要注意的點:

  • 循環的判定條件是:low <= high
  • 為了防止數值溢出,mid = low + (high - low)/2
  • 當 A[mid]不等于target時,high = mid - 1或low = mid + 1
  • leetcode參考:Search Insert Position

    2. 查找目標值區域的左邊界/查找與目標值相等的第一個位置/查找第一個不小于目標值數的位置

    A = [1,3,3,5, 7 ,7,7,7,8,14,14]
    target = 7
    return 4

    public int binarySearchLowerBound(int[] A, int target, int n){int low = 0, high = n, mid;while(low <= high){mid = low + (high - low) / 2;if(target <= A[mid]){high = mid - 1;}else{low = mid + 1;}}if(low < A.length && A[low] == target)return low;elsereturn -1; }

    3. 查找目標值區域的右邊界/查找與目標值相等的最后一個位置/查找最后一個不大于目標值數的位置

    A = [1,3,3,5,7,7,7, 7 ,8,14,14]
    target = 7
    return 7

    public int binarySearchUpperBound(int[] A, int target, int n){int low = 0, high = n, mid;while(low <= high){mid = low + (high - low) / 2;if(target >= A[mid]){low = mid + 1;}else{high = mid - 1;}}if(high >= 0 && A[high] == target)return high;elsereturn -1; }

    此題以可變形為查找第一個大于目標值的數/查找比目標值大但是最接近目標值的數,我們已經找到了最后一個不大于目標值的數,那么再往后進一位,返回high + 1,就是第一個大于目標值的數。

    劍指offer:數字在排序數組中出現的次數

    4. 查找最后一個小于目標值的數/查找比目標值小但是最接近目標值的數

    此題以可由第 2 題變形而來,我們已經找到了目標值區域的下(左)邊界,那么再往左退一位,即low - 1,就是最后一個小于目標值的數。其實low - 1也是退出循環后high的值,因為此時 high剛好等于low - 1,它小于low,所以 while 循環結束。我們只要判斷high是否超出邊界即可。

    A = [1,3,3, 5 ,7,7,7,7,8,14,14]
    target = 7
    return 3

    int low = 0, high = n, mid; while(low <= high){mid = low + (high - low) / 2;if(target <= A[mid]){high = mid - 1;}else{low = mid + 1;} } return high < 0 ? -1 : high;

    5. 查找第一個大于目標值的數/查找比目標值大但是最接近目標值的數

    此題以可由第 3 題變形而來,我們已經找到了目標值區域的上(右)邊界,那么再往右進一位,即high + 1,就是第一個大于目標值的數。其實high + 1也是退出循環后low的值,因為此時 low剛好等于high + 1,它大于high,所以 while 循環結束。我們只要判斷low是否超出邊界即可。

    A = [1,3,3,5,7,7,7,7, 8 ,14,14]
    target = 7
    return 8

    int low = 0, high = n, mid; while(low <= high){mid = low + (high - low) / 2;if(target >= A[mid]){low = mid + 1;}else{high = mid - 1;} } return low > n ? -1 : low;

    ?

    總結

    以上是生活随笔為你收集整理的二分查找2的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。