代码题--C++--小米--二分查找
题目描述
请实现有重复数字的有序数组的二分查找。
输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。
示例1:
输入
5,4,[1,2,4,4,5]
返回值
3
说明
输出位置从1开始计算,所以上面是输出3,5是数组长度,4是要查找的数字,后面是数组
解题思路:二分查找就是先从最中间的数字开始比较,如果中间数字大于要查找的数字,然后先排除掉小于最小数字的,即mid==0时,以及为了输出第一个大于等于的值,即满足a[mid-1] <v, 将mid+1返回,其余的都将right = mid;如果中间数字小于要查找的数字,直接left=mid+1,剩下的就是找不到的,返回n+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>& a) {
// write code here
int left = 0;
int right = n-1;
while( left <= right )
{
int mid = left +(right - left)/2;
if (a[mid] >= v) {
if (mid == 0 || a[mid - 1] < v) return mid + 1;
else
right = mid;
}
else
left = mid + 1;
}
return n + 1;
}
};