leedcode二分法查找(js/python实现)

例1(js):

/*

        二分法:

            查找升序排列的数组中的某个值,并返回其序号,没有则返回-1

            规定左右区域,设定该区域的中间序号mid

            若中间对应值小于目标值,则令左边边界等于中间值+1,使下一步比较在mid右边进行

            若中间对应值大于目标值,则令右边边界值等于中间值-1,使下一步比较在mid左边进行

            若中间对应值等于目标值,则输出中间值

         */

        var search = function (nums, target) {

            // var nums = [-1, 0, 3, 5, 9, 12];

            // var target = 9;

            var low = 0;

            var high = nums.length - 1;

            while (low <= high) {

                var mid = Math.floor((high - low) / 2) + low;

                // 若中间对应值等于目标值,则输出中间值

                if (nums[mid] === target) {

                    return mid;

                }

                // 若中间对应值大于目标值,则令右边边界值等于中间值-1,使下一步比较在mid左边进行

                else if (nums[mid] > target) {

                    high = mid - 1;

                }

                // 若中间对应值小于目标值,则令左边边界等于中间值+1,使下一步比较在mid右边进行

                else {

                    low = mid + 1;

                }

            }

            // 若没有找到则返回-1

            return -1;

        };

        console.log(search([-1, 0, 3, 5, 9, 12], 9));

例2(python):

//查找错误版本号,返回最初错误的版本号

//思路:设置左右区域,得到中间值,若中间值错误(返回true),则说明前面可能有版本号错误,则令right = mid  - 1,若中间值返回false,则left = mid + 1。

//直到left = right时,说明已经是最初错误的版本号

//注意python语法。。。我这记性

def firstBadVersion(self, n):

        """

        :type n: int

        :rtype: int

        """

        l = 1

        r = n

        while l<=r:

            m = (r+l)//2

            if isBadVersion(m):

                r = m-1

            else:

                l = m+1

        return l

例3:

//给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

//请必须使用时间复杂度为 O(log n) 的算法。

def searchInsert(nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        l = 0
        r = len(nums) - 1
        while l <= r :
            m = (r + l)//2
            if nums[m]<target :
                l = m+1
            elif nums[m]>target :
                r = m-1
            else :

                //找到返回m
                return m

        //找不到返回左值
        return l

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值