牛客题霸——二分查找(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)的主要内容,如果未能解决你的问题,请参考以下文章
牛客题霸 SQL5 查找所有员工的last_name和first_name以及对应部门编号dept_no