二分查找--考虑target不在查询数组内的情况

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;
    }
};
posted @ 2020-09-24 16:21  litchi99  阅读(95)  评论(0编辑  收藏  举报