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

二分查找及变体

简介

二分查找(binary search)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。
学习视频:代码随想录-二分查找

常见的用法有三种:

  • 查找目标元素的位置:即目标元素的位置
  • 查找目标元素的下界(lower bound):小于目标元素的第一个位置
  • 查找目标元素的上界(upper bound):大于目标元素的第一个位置

练习题

704. 二分查找

思路

  • 经典的二分查找;
  • 直接实现即可。

代码

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""l, r = 0, len(nums) - 1while(l <= r):m = l + (r - l) // 2if nums[m] > target:r = m - 1elif nums[m] < target:l = m + 1else:return mreturn -1

35. 搜索插入位置

思路

  • 类lowerbound查找;
  • 时刻清楚边界的条件:while结束时区间情况为[r, l],r位置元素比target小,l位置即为待插入的位置。

代码

class Solution(object):
class Solution(object):def searchInsert(self, nums, target):""":type nums: List[int]:type target: int:rtype: int"""l, r = 0, len(nums) - 1while l <= r:m = l + (r - l) // 2if nums[m] > target:r = m - 1elif nums[m] < target:l = m + 1else:return mreturn l

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

思路

  • 考虑upperbound和lowerbound
  • lowerbound::每次把区间往左边压缩,结束判断边界元素
  • upperbound:每次把区间往右边压缩,结束时判断边界元素

代码

class Solution(object):def searchRange(self, nums, target):""":type nums: List[int]:type target: int:rtype: List[int]"""n = len(nums)if n == 0:return [-1, -1]elif n == 1:return [0, 0] if nums[0] == target else [-1, -1]l, r = 0, n - 1ans = [-1, -1]while l <= r: // lower boundm = (l + r) // 2if nums[m] >= target:r = m - 1else:l = m + 1if l < n and nums[l] == target:ans[0] = ll, r = 0, n - 1while l <= r: // upper boundm = (l + r) // 2if nums[m] > target:r = m - 1else:l = m + 1if r < n and nums[r] == target:ans[1] = rreturn ans         

http://www.mrgr.cn/news/36111.html

相关文章:

  • shell配置文件介绍
  • 一个简单的个人博客管理平台适合新手学习(最底下有github链接)
  • 【多线程】面试高频考点!JUC常见类的详细总结,建议收藏!
  • add normal user to docker group
  • 信息安全工程师(17)密码体制分类
  • Python操作系统的6个自动化脚本
  • 一个操作榨干宽带WIFI性能,运营商直呼内行
  • 护工系统|护理陪护系统|陪护系统开发
  • Java: String类
  • Rust语言桌面应用开发GTK3 Gtk3-rs Glade
  • 解释python requests包的timeout
  • OpenAI创始人的长文:在智能时代下的全国信息学奥赛泄题事件反思
  • 负载均衡的作用
  • 2024-2025华为ICT大赛报名|赛前辅导|学习资料
  • 生成式AI在电商场景的应用、前景与挑战,零基础入门到精通,收藏这一篇就够了
  • PCB - 电气线应该离板子边缘远一点(最好板子外框单独开一层),避免引起误会
  • 深入理解Spring Data JPA与接口编程
  • “领航猿1号” 正式更名为 “AGI舰长”
  • python如何将字符转换为数字
  • 软件测试基础知识总结