牛客题霸——二分查找(Javascript)

Posted 小庄特别爱学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客题霸——二分查找(Javascript)相关的知识,希望对你有一定的参考价值。

一、题目地址

https://www.nowcoder.com/practice/7bc4a1c7c371425d9faa9d1b511fe193?tpId=117

二、具体代码

/**
 * 二分查找
 * @param n int整型 数组长度
 * @param v int整型 查找值
 * @param a int整型一维数组 有序数组
 * @return int整型
 */
function upper_bound_( n ,  v ,  a ) {
    //1、直接先考虑特殊情况:第一个大于等于目标值的数的位置,1号下标值为0,故输出0 + 1 = 1,即1
    if(a[0] >= v) {
        return 1;
    }
    //2、下面是进行二分查找的步骤
    let left = 0;
    let right = n - 1;
    while(left <= right) {
        let mid = Math.floor((left + right) / 2);
        //多一个等于判断条件,是方便自己理解,但是时间复杂度同样变高,所以做法仅供参考。
        if(v === a[mid]) {
        	/*
        		加个while循环的目的:
        		(1)当mid下标值对应的值等于目标值v时;
        		(2)该循环是为了判断:前面mid-1下标值对应的值是否同时也等于目标值v;
        		(3)如果等于,则mid下标值向前移动一位;
        		(4)直到mid下标值对应值的前一位值,不等于目标值v时,则跳出循环;
        		(5)最后直接返回mid + 1;
        	 */
            while(mid != 0 && a[mid - 1] === a[mid]) mid--;
            return mid + 1;
        } else if(v < a[mid]) {
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }
    //3、如果没找到,直接返回题目要求中的n + 1
    return n + 1;
}
module.exports = {
    upper_bound_ : upper_bound_
};

以上是关于牛客题霸——二分查找(Javascript)的主要内容,如果未能解决你的问题,请参考以下文章

牛客题霸-SQL篇——10~20题

牛客题霸 NC29 二维数组中的查找

牛客题霸 SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no

牛客题霸 SQL4 查找所有已经分配部门的员工的last_name和first_name以及dept_no

牛客题霸 NC10 大数乘法

牛客题霸 NC26 括号生成