1.二分查找第一個比k大的數下標
舉例:int arr[5] = {1,2,3,4,5};
- 若查找 k = 0; 則返回最左下標,即返回 0;
- 若查找 k = 3; 則返回下標 2;
- 若查找 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};
- 若查找 k = 0; 則返回最左下標,即返回 0;(返回結果需要檢測的地方)
- 若查找 k = 3; 則返回下標 1;
- 若查找 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;
}