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

【蓝桥杯】二分查找

1. 题目

题目描述
给定一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请找出给定目标值在数组中的开始位置和结束位置。

如果数组中不存在目标值,返回 [-1, -1]

要求

  1. 必须使用二分查找算法

  2. 时间复杂度必须是 O(log n)

  3. 不能使用线性扫描或内置函数直接查找(如 index()find() 等)

示例

输入: nums = [5,7,7,8,8,10], target = 8
输出: [3,4]

输入: nums = [5,7,7,8,8,10], target = 6
输出: [-1,-1]

输入: nums = [], target = 0
输出: [-1,-1]

2. 思路

1. 为什么必须用二分查找

  • 题目明确要求时间复杂度 O(log n)

  • 线性扫描法(O(n))不符合要求

  • 数组已排序,是二分查找的典型应用场景

2. 问题分解

需要解决两个子问题:

  1. 找到 target 的第一个位置(左边界)

  2. 找到 target 的最后一个位置(右边界)

3. 二分查找变种

  • 标准二分查找找到目标值就返回

  • 本题需要继续查找边界,因此需要修改标准算法

4. 算法步骤

  1. 实现查找左边界的二分查找

    • 当 nums[mid] >= target 时继续向左搜索

    • 最后检查找到的位置是否等于 target

  2. 实现查找右边界的二分查找

    • 当 nums[mid] <= target 时继续向右搜索

    • 最后检查找到的位置是否等于 target

  3. 组合两个结果

3. 代码

nums=list(map(int,input().split()))
target=int(input())
"""
在排序数组中查找元素的第一个和最后一个位置
param nums: 非递减排序的整数数组
param target: 要查找的目标值
return: 目标值的起始和结束位置 [start, end],如果不存在返回 [-1, -1]
"""
def find_left():
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] >= target:
            right = mid - 1
         else:
            left = mid + 1
    return left if left < len(nums) and nums[left] == target else -1
    
def find_right():
    left, right = 0, len(nums) - 1
    while left <= right:
        mid = (left + right) // 2
        if nums[mid] <= target:
            left = mid + 1
        else:
            right = mid - 1
    return right if right >= 0 and nums[right] == target else -1
    
if not nums:
    return [-1, -1]
    
left_pos = find_left()
right_pos = find_right()
    
print([left_pos, right_pos])
http://www.dtcms.com/a/123341.html

相关文章:

  • springcloud进阶
  • SkyWalking + ELK 全链路监控系统整合指南
  • FPGA_DDR(二)
  • Go语言编写一个进销存Web软件的demo
  • python基础语法1:输入输出
  • Java 基础 - 反射(1)
  • Java学习——day26(线程同步与共享资源保护)
  • FastAPI用户认证系统开发指南:从零构建安全API
  • Cloudflare 缓存工作原理
  • ComfyUI_Echomimic部署问题集合
  • 企业信息化-系统架构师(九十八)
  • 玩转Docker | 使用Docker搭建pinry图片展示系统
  • swagger + Document
  • 修改 docker 工作目录
  • MySQL的索引下推是什么
  • opengrok使用指南
  • 了解 DeFi:去中心化金融的入门指南与未来展望
  • JS—防抖和节流:1分钟掌握防抖和节流
  • 【ctfplus】python靶场记录-任意文件读取+tornado模板注入+yaml反序列化(新手向)
  • 良渚实验室郭国骥/夏宏光团队合作开发单细胞水平筛选抗肿瘤药物的深度学习框架——“神农”
  • 蓝桥杯C++组算法知识点整理 · 考前突击(上)【小白适用】
  • Java 面试总结
  • 数据结构 | 证明链表环结构是否存在
  • ubuntu设备磁盘空间不足 处理办法
  • WinForm真入门(12)——RadioButton控件详解
  • C++中static与private继承关系解析
  • Soybean Admin 使用tv-focusable兼容电视TV端支持遥控器移动焦点
  • 智能体代理模式(Agent Agentic Patterns)深度解析
  • C盘清理技巧分享
  • 期权与期货的在险价值