【leetcode64-69二分查找、70-74栈、75-77堆】

二分查找[64-69]

时间复杂度O(log n),要想到二分排序

35.搜索插入位置

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

74.搜索二维矩阵



python 复制代码
class Solution:
    def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:
        m = len(matrix)  #行
        n = len(matrix[0])  #列
        left = 0
        right = m*n -1
        while left <= right:
            mid = (left+right)//2
            i = mid // n
            j = mid % n
            if matrix[i][j] < target:
                left = mid + 1
            elif matrix[i][j] > target:
                right = mid - 1
            else:
                return True
        return False

34.在排序数组中查找元素的第一个和最后一个位置

python 复制代码
class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
    	if len(nums) == 0: 
    		return [-1,-1]
    		
        left = 0
        right = len(nums)-1
        while left <= right:
            mid = (left+right)//2
            if nums[mid] < target:
                left = mid +1
            elif nums[mid] > target:
                right = mid-1
            else :
                i = j = mid
                while i>=0 and nums[i] == target:
                    i -= 1
                while j<len(nums) and nums[j] == target:
                    j += 1
                return [i+1, j-1]
        return [-1,-1]
python 复制代码
# 1、首先,在 nums 数组中二分查找得到第一个大于等于 target的下标leftBorder;
# 2、在 nums 数组中二分查找得到第一个大于等于 target+1的下标, 减1则得到rightBorder;
# 3、如果开始位置在数组的右边或者不存在target,则返回[-1, -1] 。否则返回[leftBorder, rightBorder]
class Solution:
    def searchRange(self, nums: List[int], target: int) -> List[int]:
        def binarySearch(nums:List[int], target:int) -> int:
            left, right = 0, len(nums)-1
            while left<=right: # 不变量:左闭右闭区间
                middle = left + (right-left) //2 
                if nums[middle] >= target: 
                    right = middle - 1
                else: 
                    left = middle + 1
            return left  # 若存在target,则返回第一个等于target的值 

        leftBorder = binarySearch(nums, target) # 搜索左边界
        rightBorder = binarySearch(nums, target+1) -1  # 搜索右边界
        if leftBorder == len(nums) or nums[leftBorder]!= target: # 情况一和情况二
            return [-1, -1]
        return [leftBorder, rightBorder]

33.搜索旋转排序数组

python 复制代码
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left = 0
        right = len(nums)-1
        while left<= right:
            mid = (left+right)//2   #mid要么左边升序,要么右边升序
            if nums[mid] == target: 
                return mid
            elif nums[mid] < nums[right]:   #[mid,right]右边升序
                if target > nums[mid] and target <= nums[right]: #target在区间(mid,right]
                    left = mid +1
                else: 
                    right = mid-1
            else:   #[left, mid],左边升序
                if target >= nums[left] and target < nums[mid]: #target在区间[left, mid)
                    right = mid -1
                else: 
                    left = mid +1 

        return -1

153.寻找旋转排序数组中的最小值

4.寻找两个正序数组的中位数

相关推荐
IT大白鼠16 分钟前
AIGC性能的关键瓶颈:算力、数据、算法三者如何互相制约?
算法·aigc
白雪茫茫1 小时前
监督学习、半监督学习、无监督学习算法详解
python·学习·算法·ai
FengyunSky1 小时前
浅析 空间频率响应 SFR 计算
算法
树下水月1 小时前
PHP 一种改良版的雪花算法
算法·php·dreamweaver
一只数据集2 小时前
全尺寸人形机器人灵巧手力觉触觉数据集-2908条ROSbag数据覆盖14大应用场景深度解析
大数据·人工智能·算法·机器人
罗西的思考3 小时前
【GUI-Agent】阿里通义MAI-UI 代码阅读(2)--- 实现
人工智能·算法·机器学习
刀法如飞4 小时前
TypeScript 数组去重的 20 种实现方式,哪一种你还不知道?
前端·javascript·算法
sali-tec5 小时前
C# 基于OpenCv的视觉工作流-章66-直线夹角
图像处理·人工智能·opencv·算法·计算机视觉
AC赳赳老秦5 小时前
接口测试自动化:用 OpenClaw 对接 Postman,实现批量回归测试、测试报告自动生成与推送
java·人工智能·python·算法·elasticsearch·deepseek·openclaw
_风满楼5 小时前
TDD实战-会议室冲突检测的红绿重构循环
前端·javascript·算法