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
// 搜索区间左闭右开,[left, right)
int left = 0; // 左边界,数组中的最大值元素
int right = n-1; // 右边界,数组长度
// 循环条件,左边界小于右边界
while(left < right){
int mid = left+(right-left)/2;
// mid值大于目标值,右边界向左收缩
if (a[mid] >= v) {
// 当mid==0,即查找到数组起始位置,不能再继续循环,故此时退出
// 当a[mid-1]<v且a[mid] >= v,此时可认为mid即是target的索引位置
if (mid == 0 || a[mid-1]<v) return mid+1;
else
right = mid; //目标数target在左半幅,将下一次数组查询的右边界改为mid
}
// mid值小于目标值,左边界向右扩张
else
left = mid +1;
// 传统方法
// 符合条件时不立即返回,继续收缩右侧边界,锁定左侧边界
//else if (a[mid]==v) {
// right = mid;
//}
}
return n+1;
}
};