hot100-二分查找

35. 搜索插入位置

35. 搜索插入位置 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def searchInsert(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        left,right = 0, len(nums)-1
        while left<=right:
            mid = (left+right)//2
            if nums[mid] == target:
                return mid
            elif nums[mid]<target:
                left = mid+1
            else:
                right = mid-1
        return left

时间复杂度:O(logn)

空间复杂度:O(1)

74. 搜索二维矩阵

74. 搜索二维矩阵 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        # 一种思路是分别在行和列上进行二分查找【需要查找两次】
        # 更简单的思路是,把每一行拼接在一起,就是一个升序数组
        # 我们仅仅确定这个升序数组的下标和矩阵的下标对应关系即可
        m,n = len(matrix),len(matrix[0])
        left,right = 0,m*n-1
        while left<=right:
            mid = (left+right)//2
            x = matrix[mid//n][mid%n]
            if x == target:
                return True
            elif x<target:
                left = mid+1
            else:
                right = mid-1
        return False

时间复杂度:O(logmn)

空间复杂度:O(1)

34. 查找第一个和最后一个位置

34. 在排序数组中查找元素的第一个和最后一个位置 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def searchBinary(self, nums, target, lower):
        left,right = 0,len(nums)-1
        res = len(nums)
        while left<=right:
            mid = (left+right)//2
            # 很巧妙的写法,可以只使用一个函数
            if nums[mid] > target or (lower and nums[mid]>=target):
                right = mid -1
                res = mid
            else:
                left = mid + 1
        return res

    def searchRange(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        # 我们只要想办法找到第一个等于target的下标1
        # 然后找到最后一个等于target的下标2
        # 所以其实是我们找到第一个大于等于的下标就是1
        # 我们找到的第一个大于的下标就是2
        left = self.searchBinary(nums,target,True)
        right = self.searchBinary(nums,target,False)-1
        if left<=right and right<len(nums) and nums[left] == target:
            return [left,right]
        return [-1,-1]

时间复杂度:O(logn)

空间复杂度:O(1)

33. 搜索旋转排序数组

33. 搜索旋转排序数组 - 力扣(LeetCode)

python 复制代码
class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        if not nums:
            return -1
        left,right = 0,len(nums)-1
        while left<=right:
            mid = (left+right)//2
            if nums[mid]==target:
                return mid
            # 锁定查找子区间
            if nums[0]<=nums[mid]:
                # 此时0-mid一定有序
                if nums[0]<=target<nums[mid]:
                    right = mid-1
                else:
                    left = mid+1
            else:
                # 此时mid-(n-1)一定有序
                if nums[mid]<target<=nums[-1]:
                    left = mid+1
                else:
                    right = mid-1
        return -1

时间复杂度:O(logn)

空间复杂度:O(1)

注意:nums[0]<=nums[mid]

如果使用严格小于号nums[0]<nums[mid]。当mid=0时,nums[0]==nums[mid],会进入else分支,错误地认为右半部分有序。但此时左半部分(只有一个元素)实际上是有序的,而右半部分可能无序。例如,在nums=[3,1]中查找target=1:

  • 第一次循环:left=0, right=1, mid=0nums[mid]=3≠1,由于 nums[0]<nums[mid] 为假,进入 else
  • 判断 nums[mid]< target<= nums[-1]3 < 1 <= 1 为假,于是执行 right = mid-1 = -1
  • 循环结束,返回 -1,但实际目标值存在(索引1)。
相关推荐
逆境不可逃1 天前
LeetCode 热题 100 之 543. 二叉树的直径 102. 二叉树的层序遍历 108. 将有序数组转换为二叉搜索树 98. 验证二叉搜索树
算法·leetcode·职场和发展
计算机安禾1 天前
【数据结构与算法】第19篇:树与二叉树的基础概念
c语言·开发语言·数据结构·c++·算法·visual studio code·visual studio
副露のmagic1 天前
哈希章节 leetcode 思路&实现
算法·leetcode·哈希算法
副露のmagic1 天前
字符串章节 leetcode 思路&实现
windows·python·leetcode
csuzhucong1 天前
puzzle(1037)黑白、黑白棋局
算法
XiYang-DING1 天前
【LeetCode】链表 + 快慢指针找中间 | 2095. 删除链表的中间节点
算法·leetcode·链表
Zarek枫煜1 天前
[特殊字符] C3语言:传承C之高效,突破C之局限
c语言·开发语言·c++·单片机·嵌入式硬件·物联网·算法
BackCatK Chen1 天前
Python安装与VSCode配置完整教程(每步带截图说明)
vscode·python·python安装·vscode配置·python 3.9.10·嵌入式环境配置
寻寻觅觅☆1 天前
东华OJ-基础题-30-求最晚和最早日期(C++)
数据结构·c++·算法
硅基喵1 天前
Python 入门:从“其他语言”到 Pythonic 思维的完整迁移手册
python