力扣hot100_二分查找(2)_python版本

一、二分查找

  1. 如果查找不到,返回的是该插入位置
  2. 如果有多个值和target一样,返回的是第一个
python 复制代码
def binary_search(nums, target):
	left, right = -1, len(nums)
	while left+1<right:
        # 循环不变量
        # nums[left] < target
        # nums[right] >= target
		mid = (left+right)//2
		if nums[mid] < target:   # 和循环不变量对齐
			left = mid
		else:
			right = mid
	return right

二、红蓝染色法

  • 基本概念
    红蓝染色法是一种借助二分查找高效解决:需要找到满足特定条件的所有元素中的第一个或最后一个位置的情况
    红色区域:小于当前值的
    蓝色区域:大于等于当前值的

应用场景:

  • 找到 ≥ x ≥x ≥x的第一个元素
  • 找到 > x >x >x的第一个元素
  • 找到 ≤ x ≤x ≤x的最后一个元素
  • 找到 < x <x <x的最后一个元素

换句话说:二分查找的目标是找到红蓝边界,即第一个满足条件的元素。

三、162. 寻找峰值

  • 思路:红蓝染色法
    每次用numsmid 和 numsmid+1 比较,如果numsmid > numsmid+1,那么右边全是红色(小于target),否则,左边全是红色
  • 代码:
python 复制代码
class Solution:
    def findPeakElement(self, nums: List[int]) -> int:
    ''''
    因为最右边元素一定要么是峰顶,要么是峰顶左边元素,所以不用检测(否则下面的代码报错,当峰顶就是最右的时候)
    为什么要检测-1,因为返回的right,本身right就是指向>=target的。
	'''
        left, right = -1, len(nums)-1 
        while left+1<right:
            mid = (left+right)//2
            if nums[mid] > nums[mid+1]:
                right = mid
            else:
                left=mid
        return right

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

  • 思路:
    假设数组最后一个元素是最小值或者最小值的左值,那么直接做二分查找,把最后一个元素当作最小值就行。
    假设数组最后一个元素不是最小值或者其左值,那么根据红蓝染色法,二分查找可以找到第一个满足条件的元素。
  • 代码:
python 复制代码
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = -1, len(nums)-1
        while left+1<right:
            mid = (left+right)//2
            if nums[mid] < nums[-1]:
                right = mid
            else:
                left = mid
        return nums[right]

一、33. 搜索旋转排序数组

  • 思路:
相关推荐
Shaoshing几秒前
BHU 润石工作室 251019自建赛题解
算法
刘天远2 分钟前
Agent成本核算实现:事件表、状态分布与Python归集
前端·数据库·人工智能·python
Python图像识别13 分钟前
40-【2027毕设】YOLO11面部口罩检测识别系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
赵大仁17 分钟前
开源清单怎么维护才不烂掉?GitHub Actions 每周查死链 + 软 404 检测实录
python·ci/cd·自动化·开源项目·踩坑·github actions·json schema
玩AI的奶茶19 分钟前
24GB 显存能跑多大的模型?参数量、精度与显存占用对照表
人工智能·python·算法·ai·aigc·gpu算力·算力租赁
kimnoic20 分钟前
Python操作Git命令的详细指南
开发语言·python
larance22 分钟前
[菜鸟教程] 机器学习教程十一课-数据理解
人工智能·机器学习
Python图像识别24 分钟前
39-【2027毕设】YOLO11行人摔倒检测系统 - Python完整源码+PyQt5界面+训练模型+数据集
python·qt·课程设计
java_nnnn31 分钟前
LeetCode刷题双指针(有效三角形的个数+三数之和)Java
算法·leetcode·职场和发展
计算机毕业编程指导师32 分钟前
【计算机毕设】基于Hadoop的人口统计特征与肥胖风险关联分析的数据分析系统源码 毕业设计 选题推荐 毕设选题 数据分析 机器学习
大数据·hadoop·python·计算机·数据分析·课程设计·肥胖风险