一 题目
请实现有重复数字的升序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
示例1
输入:5,4,[1,2,4,4,5]
返回:3
输出位置从1开始计算
class Solution {
public:
/**
* 二分查找
* @param n int整型 数组长度
* @param v int整型 查找值
* @param a int整型vector 有序数组
* @return int整型
*/
int upper_bound_(int n, int v, vector<int>& arr) {//数组长度,查找值,数组
// write code here
int begin = 0;
int end = arr.size()-1;
int mid;
//arr数组是升序,如果最后一个元素都小于查找值,返回指定值
if(arr[end] < v){
return (n+1);
}
//存在第一个大于等于查找值的元素
while(begin < end ){
mid = (begin + end) / 2;
if(arr[mid]>= v){
end = mid;//因为数组中元素有重复,arr[mid]有可能就是第一个大于等于查找值得元素,故不能是end = mid-1;
}else{
begin = mid + 1;
}
}
return end+1; //end值就是第一个大于等于查找值的元素的位置,但因为下标从1开始,故+1
}
};