二分查找第一個比k大的數下標和最後一個比k的數下標

1.二分查找第一個比k大的數下標

舉例:int arr[5] = {1,2,3,4,5};

  1. 若查找 k = 0; 則返回最左下標,即返回 0;
  2. 若查找 k = 3; 則返回下標 2;
  3. 若查找 k = 6; 則返回最右下標的下一個,即返回 arr 的長度 5;(返回結果需要檢測的地方)
int getSubMaxK(vector<int>arr, int L ,int R, int k){
    int mid;
    int res = R+1; //也可以定義爲 R,區別在於整個數組均比k小的返回值
    while(L <= R){
        mid =  L + (R - L) / 2; //避免溢出
        if(arr[mid] > k){
            R = mid -1;
            res = mid;
        }else{
            L = mid+1;
        }
    }
    return res;
}

 

2.二分查找最後一個比k小的數下標

舉例:int arr[5] = {1,2,3,4,5};

  1. 若查找 k = 0; 則返回最左下標,即返回 0;(返回結果需要檢測的地方)
  2. 若查找 k = 3; 則返回下標 1;
  3. 若查找 k = 6; 則返回最右下標,即 4;
int getSubMinK(vector<int>arr, int L ,int R, int k){
    int mid;
    int res = 0;
    while(L <= R){
        mid =  L + (R - L) / 2;
        if(arr[mid] >= k){
            R = mid - 1;
        }else{
            res = mid;
            L = mid+1;
        }
    }
    return res;
}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章