【LeetCode】二分查找

这篇博客介绍了如何使用二分查找算法在有序数组中寻找目标值的Python和Go语言实现。两种解法详细阐述了左闭右闭与左闭右开区间边界定义的影响,并强调了终止条件。时间复杂度为logn。解题关键在于正确缩小区间并处理相等元素的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:给一个有序数组,在这个有序数组里找到一个目标值,别返回他的下标

python解法

class Solution:
    def search(self, nums: List[int], target: int) -> int: 
        left = 0
        right = len(nums)-1
        # 如果如上,找到最后left和right落在同一个元素上,所以有相等的情况
        while left <= right :
            # 取中间的下标
            mid = (left+right)//2
            # 先对比中间的元素是否是目标值
            if nums[mid] == target:
                return mid
            elif nums[mid] > target:
                right = mid-1
            else:
                left = mid+1
        # 跳出循环表示没找到
        return -1

golang解法

func search(nums []int, target int) int {
    start := 0
    end := len(nums)
    for start < end{
        //取中间值
        mid := (start + end)/2
        //判断中间值是否大于目标值
        if nums[mid] > target{
            end = mid
        //判断中间值是否小于目标值
        } else if nums[mid] < target{
            start = mid + 1
        //找到目标值,返回下标
        } else{
            return mid
        }
    }
    //没有返回-1
    return -1
        
}

时间复杂度 logn

解题思路:
1:⚠️区间边界的定义非常重要
如果刚开始定义的是左闭右闭,那之后的缩小范围也要保持左闭右闭
2:⚠️什么时候停止?
二分法一定要清楚最后找到什么元素,没找到停止,
向上面的python解法,左闭右闭,最后就是找到left和right是一个值的时候是最后一个元素,所以他有left=right的情况,如果是左闭右开就没有相等的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值