首页 > 其他分享 >力扣-704-二分查找

力扣-704-二分查找

时间:2023-11-14 14:11:27浏览次数:44  
标签:二分 __ right target nums 704 力扣 middle left

一、题目

力扣链接:https://leetcode.cn/problems/binary-search/description/

二、解法思路

标准的二分查找题目,常规上有左闭右闭和左闭右开的解法

1、左闭右闭

class Solution:
    """
    leetcode:704
    采用左闭右闭的方式,[left,right]
    区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,所以有如下两点:
        1、while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
        2、if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
    """

    def search(self, nums: List[int], target: int) -> int:
        if target not in range(1, 10000):
            return -1
        if not nums:
            return -1
        left = 0
        right = len(nums) - 1
        while left <= right:
            middle = left + ((right - left) >> 1)
            if nums[middle] == target:
                return middle
            elif nums[middle] > target:
                right = middle - 1
            else:
                left = middle + 1
        else:
            return -1
          
if __name__ == '__main__':
    s = Solution()
    res = s.search(nums=[-1, 0, 3, 5, 9, 12, 37], target=12)
    print(res)

2、左闭右开

class Solution:
    """
    leetcode:704
    采用左闭右开的方式,[left,right)
    如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right) ,那么二分法的边界处理方式则截然不同。
    有如下两点:
        1、while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
        2、if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
    """

    def search(self, nums: List[int], target: int) -> int:
        if target not in range(1, 10000):
            return -1
        if not nums:
            return -1
        left = 0
        right = len(nums) - 1
        while left < right:
            middle = left + ((right - left) >> 1)
            if nums[middle] == target:
                return middle
            elif nums[middle] > target:
                right = middle
            else:
                left = middle + 1
        else:
            return -1

if __name__ == '__main__':
    s = Solution()
    res = s.search(nums=[-1, 0, 3, 5, 9, 12, 37], target=12)
    print(res)

三、其他解法与类似

类似题目:

  • 力扣34,35,69,367

标签:二分,__,right,target,nums,704,力扣,middle,left
From: https://www.cnblogs.com/chiyun/p/17831468.html

相关文章

  • 35-二分查找
    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为 O(logn) 的算法。 示例1:输入:nums=[1,3,5,6],target=5输出:2示例 2:输入:nums=[1,3,5,6],target=2输......
  • 力扣 1460 脑筋急转弯
    1460.通过翻转子数组使两个数组相等对两个数组就行排序。依次对比,有不同则返回false。所有数字一样,那就一定可以翻转使得两个数组相等,翻转次数不同而已,总能达到。当有数字不一样,那一定不会相等。classSolution{public:boolcanBeEqual(vector<int>&target,vector<int>&a......
  • 力扣2578 排序后两个数依次选择
    2578. 最小和分割隔空依次取值,相加最小,原理暂不清楚,举例演示就可发现。classSolution{public:intsplitNum(intnum){intnum1=0,num2=0;vector<int>a;while(num){a.push_back(num%10);num/=10;}......
  • 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式
    2023-11-11:用go语言,字符串哈希+二分的例题。给定长为n的源串s,以及长度为m的模式串p,要求查找源串中有多少子串与模式串匹配,s'与s匹配,当且仅当s'与s长度相同,且最多有k个位置字符不同。其中1<=n,m<=10^6,0<=k<=5。来自左程云。答案2023-11-11:go代码用灵捷3.5......
  • 2023-11-11:用go语言,字符串哈希+二分的例题。 给定长为 n 的源串 s,以及长度为 m 的模式
    2023-11-11:用go语言,字符串哈希+二分的例题。给定长为n的源串s,以及长度为m的模式串p,要求查找源串中有多少子串与模式串匹配,s'与s匹配,当且仅当s'与s长度相同,且最多有k个位置字符不同。其中1<=n,m<=10^6,0<=k<=5。来自左程云。答案2023-11-11:go代码用......
  • 二分
    二分查找模板总结(区间、条件不再纠结)二分查找是一种在有序数组中查找某一特定元素的搜索算法。元素集合有顺序,元素性质有分界点,二分法就可以用来求分界点,并不一定要求集合中元素是不重复的。算法思路:假设目标值在闭区间[left,right]中,每次将区间长度缩小一半,当left=rig......
  • 力扣2293 暴力模拟
    2293. 极大极小游戏给你一个下标从 0 开始的整数数组 nums ,其长度是 2 的幂。对 nums 执行下述算法:设 n 等于 nums 的长度,如果 n==1 ,终止 算法过程。否则,创建 一个新的整数数组 newNums ,新数组长度为 n/2 ,下标从 0 开始。对于满足 0<=i<n/2 的......
  • 二分(折半查找)详细解答(边界条件终止条件等等详细解释)
    刷Leetcode总能遇到关于二分的题目,但是之前也只是草草地了解一下,每次在使用的时候都需要找模板,要不然就需要对于边界条件进行调试,着实是很麻烦!!!二分介绍:首先来简单介绍一下二分:二分查找也称折半查找(BinarySearch),它是一种效率较高的查找方法。但是,折半查找要求 线性表 必须......
  • 力扣2406. 将区间分为最少组数
    给你一个二维整数数组 intervals ,其中 intervals[i]=[lefti,righti] 表示 闭 区间 [lefti,righti] 。你需要将 intervals 划分为一个或者多个区间 组 ,每个区间 只 属于一个组,且同一个组中任意两个区间 不相交 。请你返回 最少 需要划分成多少个组。如果......
  • 力扣466
     定义str=[s,n]表示str由n个字符串s连接构成。例如,str==["abc",3]=="abcabcabc"。如果可以从s2 中删除某些字符使其变为s1,则称字符串s1 可以从字符串s2获得。例如,根据定义,s1="abc"可以从s2="abdbec"获得,仅需要删除加粗且用斜体标识的字符......