当前位置: 首页 > article >正文

【力扣打卡系列】二分查找(红蓝染色法)

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day8

在排序数组中查找元素的第一个和最后一个位置
  • 题目描述在这里插入图片描述
  • 解题思路
    • 二分查找
      • 注意勿漏循环,条件为left <= right
      • 注意比较的是nums[mid]与target的值,不是mid
      • 注意if start == len(nums)|| nums[start] != target,两个条件缺一不可
      • 如何找end:找到大于等于target+1的第一个位置,即find(nums,target+1),再-1就好
  • 代码参考
func find(nums []int, target int) int{
    left := 0
    right := len(nums) - 1
    for left <= right{
        mid := left + (right - left)/2
        if nums[mid] < target{
            left = mid + 1
        }else{
            right =mid - 1
        }
    }
    return left
}

func searchRange(nums []int, target int) []int {
    start := find(nums,target)
    if start == len(nums)|| nums[start] != target{
        return []int{-1,-1}
    }
    end := find(nums,target+1) - 1
    return []int{start, end}
}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • tips
      • 循环不变量
        • 升序数组
        • 红色:小于target;蓝色:大于等于target
        • 需要保证:L-1永远指向红色,R+1永远指向蓝色
        • 根据循环不变量
          • R+1是最终要找的答案(第一个满足大于等于target的位置)
          • 同时因为循环结束后R+1=L,所以答案也可以用L表示
        • 升序旋转数组(拆成两段升序)
          • 将mid与最后一个数比较
            • 小于最后一个数就是蓝色(min(target)及min(target)右侧);否则就是红色(在min(target)左侧)
        • 搜索升序旋转数组(拆成三段升序 )

http://www.kler.cn/a/371488.html

相关文章:

  • 嫉妒经济学:揭秘消费行为背后的情绪驱动力
  • Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP
  • 名词(术语)了解--SSR/CSR
  • 学习threejs,使用粒子实现下雪特效
  • 使用Kubernetes管理容器化应用
  • 量子容错计算
  • mysql8性能参数查看及优化
  • Photoshop图像算法(十)(代码在每个原理后面)
  • 匹配销售策略的CRM系统挑选指南
  • 基于uniapp微信小程序的旅游系统
  • conda迁移虚拟环境路径
  • Halcon 颜色处理
  • 预览 PDF 文档
  • android 手机姿态(2)
  • scenedetect视频场景变换侦测与分割
  • Me 攒的GPT修改论文提示词
  • Unity GameFramework Star Force 拆解(一)—— 启动流程
  • 机器学习与神经网络:诺贝尔物理学奖的新方向
  • Gradle 配置后续一致更新
  • redis的三种客户端
  • SpringMVC学习(2)
  • Mac开发环境配置- Shell/Homebrew/ruby
  • ele-table表格列表内,双击编辑部分信息(el-table组件同理)
  • C# OpenCvSharp DNN UNet 推理
  • 华为手机系统应用瘦身
  • 了解桌面机床用于学校教学培训应用-桌面级CNC机床