代码随想录——二分查找

2023-12-13 22:14:17

这道题目的前提是数组为有序数组,同时题目还强调数组中无重复元素,因为一旦有重复元素,使用二分查找法返回的元素下标可能不是唯一的,这些都是使用二分法的前提条件
两个坑
1.while(left < right) 还是 while(left <= right) 看右是否闭,例如,[1,1]是否合格
2.比较之后,right = middle呢,还是要right = middle - 1

主要还是看右闭还是右开

在左闭右闭的区间里,也就是[left, right]

#左闭右闭
class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left=0
        right=len(nums)-1
        
        while left<=right:
            middle=(left+right)//2
            if nums[middle] >target:
                right=middle-1
            elif nums[middle] <target:
                left=middle+1
            else:
                return middle
        return -1

#左闭右开
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums)  # 定义target在左闭右开的区间里,即:[left, right)

        while left < right:  # 因为left == right的时候,在[left, right)是无效的空间,所以使用 <
            middle = left + (right - left) // 2

            if nums[middle] > target:
                right = middle  # target 在左区间,在[left, middle)中
            elif nums[middle] < target:
                left = middle + 1  # target 在右区间,在[middle + 1, right)中
            else:
                return middle  # 数组中找到目标值,直接返回下标
        return -1  # 未找到目标值

文章来源:https://blog.csdn.net/weixin_43949714/article/details/134981445
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。