JS的lintcode学习笔记(9)—— 二分查找

问题描述:给定一个排序的整数数组(升序)和一个要查找的整数target,用O(logn)的时间查找到target第一次出现的下标(从0开始),如果target不存在于数组中,返回-1

问题说明:要注意数组中会出现重复数字,第一次找到的值未必是最后的答案。

问题分析:二分查找是分治算法中十分经典的问题,网上也有很多实现的代码,JS也有很多。但网上给出的代码大部分并没有考虑到重复值的问题,算法只能用于没有重复值的数组,这样算法的应用型就很低。在这里我改进了算法,可以在有重复值的情况下运行,若大家有进一步改进的算法,欢迎留言指正~

基本的二分查找实现起来很简单,我们定义两个指针,low和high,分别从数组的头部和尾部开始。定义一个变量mid,用来存放low和high的中间值。注意!JS的除法保留小数,所以还要记得取整。

若中间值较大,则把mid-1赋给high进入新循环;若中间值较小,就把mid+1赋给low进入新循环。

下面,最关键的就是当mid对应的值与target相等的情况。若没有重复值,可以直接返回mid即可。但当存在重复值的时候,意味着我们找到的值的前方还可能有相同的值。

此刻,我们把mid赋给high。注意,是mid而不是mid-1了,因为当前mid指向的值本身已经是相等了,所以不能减1。至于为什么要把值赋给high而不是low,是因为我们要找的是target第一次出现从下标,所以若当前mid不是所求,那么我们找到值只可能在前面而不是后面,所以把值赋给high。

这样直到low和high(包括low和high)之间的数字只有两个或者一个时,我们开始判断。首先判断low指向的值,若相等,则返回;若不相等,则返回high的值。

代码实现:

const binarySearch = function (nums, target) {
    var low = 0;
    var high = nums.length-1;
    while(low <= high){
        var mid = parseInt((low + high)/2);
        if(nums[mid] == target){
            if((high-low)>1){
                high = mid;
            }else if(nums[low] == target){
                return  low;
            }else if(nums[high] == target){
                return  high;
            }
        }else if(nums[mid] > target){
            high = mid - 1;
        }else{
            low = mid + 1;
        }
    }
    return -1;
}

 

cda备考学习学习笔记——基础知识篇(二)主要涉及了计算机科学与技术领域的基本概念和知识。 首先,它介绍了计算机网络的基础知识。网络是将多台计算机通过通信链路连接起来,使它们能够相互通信和共享资源的系统。笔记中详细介绍了网络的组成、拓扑结构和通信协议等重要内容。 其次,笔记还解释了计算机系统的基本组成。计算机系统由硬件和软件两部分组成,其中硬件包括中央处理器、存储器、输入输出设备等,而软件则分为系统软件和应用软件。笔记详细介绍了各种硬件和软件的功能和作用。 此外,笔记还对数据库管理系统进行了介绍。数据库管理系统是一种用于管理和组织数据的软件系统,它能够实现数据的存储、检索和更新等操作。笔记中详细介绍了数据库的概念、结构和操作等内容。 最后,笔记还包括了算法和数据结构的基础知识。算法是解决问题的一系列步骤和规则,而数据结构则是组织和存储数据的方式。笔记中介绍了常用的算法和数据结构,如排序算法、树和图等。 总之,通过学习CDA备考学习笔记中的基础知识篇(二),我们能够更好地理解计算机网络、计算机系统、数据库管理系统以及算法和数据结构等相关概念和知识。这些基础知识对于我们深入研究计算机科学与技术领域是非常重要的,也为我们日后的学习和工作奠定了坚实的基础。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值