🔎

二分查找

💡
题目链接: 二分查找[牛客]:LC上找不到一模一样的。

题目内容:

描述

请实现有重复数字的升序数组的二分查找。
输出在数组中第一个大于等于查找值的位置(下标从1开始算起),如果数组中不存在这样的数(指不存在大于等于查找值的数),则输出数组长度加一。

示例1

输入:5,4,[1,2,4,4,5]

返回值:3

说明:输出位置从1开始计算  

示例2

输入:5,4,[1,2,3,3,5]

返回值:5

说明:虽然数组中没有4,但 54 ,所以返回5对应的位置,刚好也是5
 

题解(核心代码模式,语言C++)


#include <vector>
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) {
		    // 注意题目中,还有一种找不到的情况,因此 r 初始化为 n,可以设想为在数组最右边插入了一个代表不存在的元素
        int l = 0, r = n;
        // 二分查找模版
        while (l < r) {
		        // 注意,这里二分不建议使用 l+r >> 1, 存在溢出可能
            int mid = l + (r - l) / 2;
            // 核心逻辑,判断目标值和中值的大小, 题目要求是大于等于目标值
            if (v <= a[mid]) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
        // 注意,下标由 1 开始,因此返回值加 1
        return l + 1;
    }
};
 
你觉得这篇文章怎么样?
YYDS
比心
加油
菜狗
views

Loading Comments...