首页 > 其他分享 >[数组]——二分查找

[数组]——二分查找

时间:2023-02-03 22:22:46浏览次数:52  
标签:二分 right target nums middle 查找 数组 left

[数组]——二分查找

1.设定左右区间和数组长度,计算中间数的索引
2.根据左右区间的距离开始循环,并判断目标数与中间数的大小关系,缩小区间
3.返回目标数在数组中的索引
注意数组区间的闭合情况!!!
图1为数组左闭右闭的情况;图2为数组左闭右开的情况。代码在细节上有所不同。
image
image

图片来源:https://www.programmercarl.com/0704.二分查找.html#思路

# python中数组左闭右闭的情况
class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left, right = 0, len(nums) - 1  # 定义target在左闭右闭的区间里,[left, right]

        while left <= right:
            middle = left + (right - left) // 2

            if nums[middle] > target:
                right = middle - 1  # target在左区间,所以[left, middle - 1]
            elif nums[middle] < target:
                left = middle + 1  # target在右区间,所以[middle + 1, right]
            else:
                return middle  # 数组中找到目标值,直接返回下标
        return -1  # 未找到目标值
python中数组左闭右开的情况
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  # 未找到目标值

标签:二分,right,target,nums,middle,查找,数组,left
From: https://www.cnblogs.com/z-qhhh/p/17089815.html

相关文章

  • 二分查找——C语言描述
    二分查找——C语言描述目录二分查找——C语言描述0测试用例框架1定义2代码4测试用例0测试用例框架https://blog.csdn.net/m0_59469991/article/details/127137119?......
  • 二分查找
    #include<iostream>usingnamespacestd;intbinarySearch(intarr[],intlow,inthigh,intkey){if(low>high){return-1;}intmid=low......
  • java 数组
                                            数组一旦创立,长度无法改变;数组角标从0开始;......
  • 数组
    数组按一定格式排列起来的,具有相同类型的数据元素集合定义后维数和维界不再改变(结构固定)且一般不做插入和删除操作,因此一般采用顺序存储结构一维数组:线性表中的数据......
  • 代码随想录-数组-C++总结
    1.二分查找重点区分左闭右开,左闭右闭两种写法中的差异,理解循环中的不变量,这样在returnr还是l和什么时候l+1r-1什么时候不需要+1-1很重要。35.搜索插入位置-力扣(Leet......
  • js中数组对象排序
    //数组对象按照指定属性排序--冒泡写法constduplicateRemovalBubbling=function(oldArr,key){for(leti=0;i<oldArr.length;i++){for(letj=0;j<oldArr.length......
  • JS数组的常用方法-常用篇
     1.join数组变成字符串   不改变原数组1letarr1=['I','Love','You']2console.log(arr1.join(),arr1);//I,Love,You,['I','Love','You']3......
  • 找到所有数组中消失的数字
    给你一个含n个整数的数组nums,其中nums[i]在区间[1,n]内。请你找出所有在[1,n]范围内但没有出现在nums中的数字,并以数组的形式返回结果。constfindDisappe......
  • js判断数组对象或对象对象数组是否包含元素包含值
    vararr=[{key:1,name:'牛百叶'},{key:2,name:'虾滑'}];//bool为true说明数组中包含这个对象为false则不包含varbool1=arr.som......
  • java翻转数组
    写一个方法用于翻转数组staticvoidarr(String[]str){String[]arr=newString[str.length];intcount=0;for(inti=str.length-1;i......