[2020.10.14] 二分查找-找第一个出现的数字

二分查找

http://www.nowcoder.com/questionTerminal/7bc4a1c7c371425d9faa9d1b511fe193

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
        // 使用迭代器,避免越界
        auto begin = a.begin();
        auto end = a.end();

        // 有序数组可以考虑避免不存在的数字,不使用也行,若存在此种情况,后续begin会指向最后end。仅仅避免后续的
        if ((a.end() - 1) < v) {
            return n + 1;
        }

        // 需要找到第一个出现的值,即使找到了数据也不停止,直到begin == end 结束为止
        while (begin < end) {
            auto mid = begin + (end - begin) / 2; 
            if (*mid < v) {
                // begin 右移
                begin = mid+1;
            } 
            if (*mid >= v) {
                // 已经找到数据,还需要继续完成查找,不断修正
                // end 移动到mid,保持end指向范围下一位
                end = mid;
            }
        }
        // 如果查找到了,此时begin已经指向确定的数据
        // 没有找到的数据在前面已经避免了,
        return begin - a.begin() + 1;
    }
};

难点在查找有序数组中的第一个;找到元素不停止,继续二分查找,直到没有数据可以查询

全部评论

相关推荐

11-14 16:13
已编辑
重庆科技大学 测试工程师
Amazarashi66:不进帖子我都知道🐮❤️网什么含金量
点赞 评论 收藏
分享
10-24 13:36
门头沟学院 Java
Zzzzoooo:更新:今天下午有hr联系我去不去客户端,拒了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务