【二分查找】力扣练题之704

本文介绍了如何使用二分查找算法在已排序的整型数组中寻找目标值。提供了两种解法,一种是直接利用列表的index方法,另一种是标准的二分查找实现。二分查找在有序数组中具有高效的时间复杂度O(logn),能够快速定位目标值的下标。当目标值不存在于数组中时,返回-1。
摘要由CSDN通过智能技术生成

题目描述:

给定一个n个元素有序的(升序)整型数组nums 和一个目标值target ,写一个函数搜索nums中的 target,如果目标值存在返回下标,否则返回 -1。

解法:
二分查找

class Solution_3:
    def search(self, nums: list, target: int) -> int:
        try:
            return nums.index(target)
        except Exception:
            return -1

如上代码是我自己根据题意写出的代码,这个解法单纯适合这个题,直接返回一个目标值在列表中的下标。

class Solution_3:
    def search_1(self, nums: list, target: int) -> int:
        start = 0
        end = len(nums) - 1
        while start <= end:
            mid = (end - start + 1) // 2 + start
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                end = mid - 1
            else:
                start = mid + 1
        return -1

这个解法就是官方的二分查找,使用二分查找,一般都是有序的排列才可。
第一,我们是在升序数组中寻找target的下标,对于特定下标i,
如果nums[i] == target,那么下标i就是我们要寻找的下标,
如果nums[i] > target,那么目标下标只能在i的左侧,即目标下标小于i,
如果nums[i] < target,那么目标下标只能在i的右侧,即目标下标大于i。
基于上述事实,可以在有序数组中使用二分查找寻找目标值。

二分查找的做法是,定义查找的范围 [left,right],初始查找范围是整个数组。每次取查找范围的中点 mid,比较 nums[mid] 和 target 的大小,如果相等则 mid 即为要寻找的下标,如果不相等则根据 nums[mid] 和 target 的大小关系将查找范围缩小一半。

由于每次查找都会将查找范围缩小一半,因此二分查找的时间复杂度是 O(logn),其中 nn 是数组的长度。

二分查找的条件是查找范围不为空,即 left≤right。如果target 在数组中,二分查找可以保证找到target,返回target 在数组中的下标。如 target 不在数组中,则当left>right 时结束查找,返回 −1。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老师好,我是刘同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值