深入理解二分查找算法(一)

💗💗💗欢迎来到我的博客,你将找到有关如何使用技术解决问题的文章,也会找到某个技术的学习路线。无论你是何种职业,我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章,也欢迎在文章下方留下你的评论和反馈。我期待着与你分享知识、互相学习和建立一个积极的社区。谢谢你的光临,让我们一起踏上这个知识之旅!
请添加图片描述

文章目录

  • 🍋引言
  • 🍋基本原理
  • 🍋算法步骤
  • 🍋应用场景
  • 🍋例题
    • 🍋1608. 特殊数组的特征值
    • 🍋2389. 和有限的最长子序列
    • 🍋744. 寻找比目标字母大的最小字母
    • 🍋704. 二分查找
    • 🍋888. 公平的糖果交换
    • 🍋268. 丢失的数字
    • 🍋278. 第一个错误的版本

🍋引言

二分查找是一种高效的搜索算法,特别适用于有序数组。它通过将待查找区间逐渐缩小一半的方式,快速定位目标元素。在本文中,我们将深入探讨二分查找算法的原理、应用场景以及实现方式。

🍋基本原理

二分查找的基本原理是不断缩小待查找区间,通过比较中间元素与目标值的大小来确定下一步搜索的方向。这种分而治之的思想使得算法的时间复杂度保持在 O(log n) 的水平,是一种非常高效的搜索算法。

🍋算法步骤

初始化左右边界:设定初始的搜索区间,通常为整个数组。
计算中间索引:通过计算左右边界的中点来确定中间索引。
比较中间元素:将中间索引对应的元素与目标值进行比较。
调整搜索范围:根据比较结果,调整左右边界,缩小搜索范围。
重复执行:重复以上步骤,直到找到目标元素或搜索范围为空。

🍋应用场景

有序数组搜索: 二分查找最常见的应用场景是在有序数组中查找元素。
搜索区间问题: 可以用于解决搜索区间的问题,如在旋转有序数组中查找最小值。
近似查找: 用于查找最接近目标值的元素。

🍋例题

有的题并没有使用二分查找

🍋1608. 特殊数组的特征值

给你一个非负整数数组 nums 。如果存在一个数 x ,使得 nums 中恰好有 x 个元素 大于或者等于 x ,那么就称 nums 是一个 特殊数组 ,而 x 是该数组的 特征值 。

注意: x 不必 是 nums 的中的元素。

如果数组 nums 是一个 特殊数组 ,请返回它的特征值 x 。否则,返回 -1 。可以证明的是,如果 nums 是特殊数组,那么其特征值 x 是 唯一的 。
在这里插入图片描述

class Solution(object):def specialArray(self, nums):""":type nums: List[int]:rtype: int"""if all(element == 0 for element in nums) == True:return -1count1 = 0for i in range(1, len(nums) + 1): # 1,2for j in range(len(nums)):if nums[j] >= i:count1 += 1if count1 != i:count1 = 0continueelse:return ireturn -1

🍋2389. 和有限的最长子序列

给你一个长度为 n 的整数数组 nums ,和一个长度为 m 的整数数组 queries 。

返回一个长度为 m 的数组 answer ,其中 answer[i] 是 nums 中 元素之和小于等于 queries[i] 的 子序列 的 最大 长度 。

子序列 是由一个数组删除某些元素(也可以不删除)但不改变剩余元素顺序得到的一个数组。
在这里插入图片描述

from itertools import accumulate
from bisect import bisect_left, bisect_right
class Solution:def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:nums.sort()s = list(accumulate(nums))return [bisect_right(s, q) for q in queries]# def answerQueries(self, nums: List[int], queries: List[int]) -> List[int]:#     nums.sort()#     m = len(queries)#     ans = [0] * m#     idx = sorted(range(m), key=lambda i: queries[i])#     s = j = 0#     for i in idx:#         while j < len(nums) and s + nums[j] <= queries[i]:#             s += nums[j]#             j += 1#         ans[i] = j#     return ans

🍋744. 寻找比目标字母大的最小字母

给你一个字符数组 letters,该数组按非递减顺序排序,以及一个字符 target。letters 里至少有两个不同的字符。

返回 letters 中大于 target 的最小的字符。如果不存在这样的字符,则返回 letters 的第一个字符。

在这里插入图片描述

from bisect import bisect_right
class Solution:def nextGreatestLetter(self, letters: List[str], target: str) -> str:position_right = bisect_right(letters, target)if position_right == len(letters):return letters[0]return letters[position_right]

🍋704. 二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
在这里插入图片描述

class Solution:def search(self, nums: List[int], target: int) -> int:low = 0high = len(nums)-1while low<=high:mid = low + (high-low)//2if nums[mid] == target:return midelif nums[mid]>target:high = mid - 1else:low = mid + 1return -1

🍋888. 公平的糖果交换

爱丽丝和鲍勃拥有不同总数量的糖果。给你两个数组 aliceSizes 和 bobSizes ,aliceSizes[i] 是爱丽丝拥有的第 i 盒糖果中的糖果数量,bobSizes[j] 是鲍勃拥有的第 j 盒糖果中的糖果数量。

两人想要互相交换一盒糖果,这样在交换之后,他们就可以拥有相同总数量的糖果。一个人拥有的糖果总数量是他们每盒糖果数量的总和。

返回一个整数数组 answer,其中 answer[0] 是爱丽丝必须交换的糖果盒中的糖果的数目,answer[1] 是鲍勃必须交换的糖果盒中的糖果的数目。如果存在多个答案,你可以返回其中 任何一个 。题目测试用例保证存在与输入对应的答案。

在这里插入图片描述

class Solution:def swap(self,a, b):return b, a # def fairCandySwap(self, aliceSizes: List[int], bobSizes: List[int]) -> List[int]:  # 超时#     result1 = 0#     result2 = 0#     l_ = []#     for i in range(len(aliceSizes)):#         for j in range(len(bobSizes)):#             aliceSizes[i],bobSizes[j] = self.swap(aliceSizes[i],bobSizes[j])#             if sum(bobSizes) == sum(aliceSizes):#                 l_.append(bobSizes[j])#                 l_.append(aliceSizes[i])#                 return l_#             aliceSizes[i], bobSizes[j] = self.swap(aliceSizes[i], bobSizes[j])def fairCandySwap(self, aliceSizes: List[int], bobSizes: List[int]) -> List[int]:# sum(aliceSizes)-A+B=sum(bobSizes)-B+A# A-B=tmp=(sum(aliceSizes)-sum(bobSizes))//2tmp = (sum(aliceSizes) - sum(bobSizes)) >> 1for a in aliceSizes:if a - tmp in bobSizes: return [a, a - tmp]

🍋268. 丢失的数字

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

在这里插入图片描述

class Solution:def missingNumber(self, nums: List[int]) -> int:# for i in range(len(nums)+1):#     if i not in nums:#         return i   # 过了,但是太慢nums.sort()for i, num in enumerate(nums):if num != i:return ireturn len(nums)

🍋278. 第一个错误的版本

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
在这里插入图片描述

# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:class Solution:def firstBadVersion(self, n: int) -> int:low = 0high = n-1while low<=high:mid = low + (high-low)//2if isBadVersion(mid)==True :high = mid - 1else:low = mid + 1return low

请添加图片描述

挑战与创造都是很痛苦的,但是很充实。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/582946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK获取相机当前实时帧率(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPI SDK使用UserSet功能保存和载入相机的各类参数&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在NEOAPI SDK里通过函数获取相机帧率 Baume…

Android Studio新手实战——深入学习Activity组件

目录 前言 一、Activity简介 二、任务栈相关概念 三、常用Flag 四、结束当前Activity 五、Intent跳转Activity 六、更多资源 前言 Android是目前全球最流行的移动操作系统之一&#xff0c;而Activity作为Android应用程序的四大组件之一&#xff0c;是Android应用程序的核…

JAX: 快如 PyTorch,简单如 NumPy - 深度学习与数据科学

JAX 是 TensorFlow 和 PyTorch 的新竞争对手。 JAX 强调简单性而不牺牲速度和可扩展性。由于 JAX 需要更少的样板代码&#xff0c;因此程序更短、更接近数学&#xff0c;因此更容易理解。 长话短说&#xff1a; 使用 import jax.numpy 访问 NumPy 函数&#xff0c;使用 import …

华为云CCE-集群内访问-根据ip访问同个pod

华为云CCE-集群内访问-根据ip访问同个pod 问题描述&#xff1a;架构如下&#xff1a;解决方法&#xff1a; 问题描述&#xff1a; 使用service集群内访问时&#xff0c;由于启用了两个pod&#xff0c;导致请求轮询在两个pod之间&#xff0c;无法返回正确的结果。 架构如下&am…

Javascript 可迭代对象与yeild

一、可迭代对象&#xff08;Iterable object&#xff09; Javascript 可迭代对象是指实现了Symbol.iterator方法的对象&#xff0c;该方法返回一个迭代器对象&#xff0c;可以通过迭代器对象来遍历对象中的元素。常见的可迭代对象包括数组、字符串、Map、Set等。可以使用for..…

Redis布隆过滤器BloomFilter

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理、数据库技术&#x1f525;如果感觉博主的文章还不错的…

Unreal Engine游戏引擎的优势

在现在这个繁荣的游戏开发行业中&#xff0c;选择合适的游戏引擎是非常重要的。其中&#xff0c;Unreal Engine作为一款功能强大的游戏引擎&#xff0c;在业界广受赞誉。那Unreal Engine游戏引擎究竟有哪些优势&#xff0c;带大家简单的了解一下。 图形渲染技术 Unreal Engin…

遇见sql语句拼装报错 sql injection violation, syntax error: syntax error, expect RPAREN

在使用PostgreSql瀚高数据库时&#xff0c;相同的语句 select * from public.files_info fi where fi.file_size notnull 在DBever能执行&#xff0c;但是在spring中报错 在spring中JPA版本问题导致&#xff0c;不支持这种写法&#xff0c;会识别为sql注入风险&#xff0c;应…

硅像素传感器文献调研(四)

写在前面&#xff1a; 好喜欢这种短论文哈哈哈哈哈 感觉这篇文献已经提到了保护环的概念啊&#xff0c;只不过叫的是&#xff1a;场限制环。 1986——高压功率器件场终端横向掺杂的变化 0.摘要 对于高压平面结提出了一个简单的新概念。通过在氧化物掩模中的小开口和随后的驱…

python如何读取被压缩的图像

读取压缩的图像数据&#xff1a; PackBits 压缩介绍&#xff1a; CCITT T.3 压缩介绍&#xff1a; 读取压缩的图像数据&#xff1a; 在做图像处理的时候&#xff0c;平时都是使用 函数io.imread() 或者是 函数cv2.imread( ) 函数来读取图像数据&#xff0c;很少用PIL.Image…

Grafana Loki 组件介绍

Loki 日志系统由以下3个部分组成&#xff1a; Loki是主服务器&#xff0c;负责存储日志和处理查询。Promtail是专为loki定制的代理&#xff0c;负责收集日志并将其发送给 loki 。Grafana用于 UI展示。 Distributor Distributor 是客户端连接的组件&#xff0c;用于收集日志…

2022年全国职业院校技能大赛(高职组)“云计算”赛项赛卷①第一场次:私有云

2022年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算”赛项赛卷1 第一场次&#xff1a;私有云&#xff08;30分&#xff09; 目录 2022年全国职业院校技能大赛&#xff08;高职组&#xff09; “云计算”赛项赛卷1 第一场次&#xff1a;私有云&#xff0…

【Linux学习笔记】解析Linux系统内核:架构、功能、工作原理和发展趋势

操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体&#xff0c;它们互相依赖&#xff0c;不可分割。计算机的硬件&#xff0c;含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是…

磁盘相关知识

一、硬盘数据结构 1.扇区&#xff1a; 盘片被分为多个扇形区域&#xff0c;每个扇区存放512字节的数据&#xff08;扇区越多容量越大&#xff09; 存放数据的最小单位 512字节 &#xff08;硬盘最小的存储单位是扇区&#xff0c;512 个字节&#xff0c;八个扇区组成一块&…

FPGA - 231227 - 5CSEMA5F31C6 - 电子万年历

TAG - F P G A 、 5 C S E M A 5 F 31 C 6 、电子万年历、 V e r i l o g FPGA、5CSEMA5F31C6、电子万年历、Verilog FPGA、5CSEMA5F31C6、电子万年历、Verilog 顶层模块 module TOP(input CLK,RST,inA,inB,inC,switch_alarm,output led,beep_led,output [41:0] dp );// 按键…

听GPT 讲Rust源代码--src/tools(29)

File: rust/src/tools/clippy/clippy_lints/src/unused_peekable.rs 在Rust源代码中&#xff0c;rust/src/tools/clippy/clippy_lints/src/unused_peekable.rs这个文件是Clippy工具中一个特定的Lint规则的实现文件&#xff0c;用于检测未使用的Peekable迭代器。 Peekable迭代器…

每日一题:LeetCode-LCR 179. 查找总价格为目标值的两个商品

每日一题系列&#xff08;day 16&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

大厂前端面试题总结(百度、字节跳动、腾讯、小米.....),附上热乎面试经验!

先简单介绍下自己&#xff0c;我“平平无奇小天才”一枚&#xff0c;毕业于南方普通985普通学生&#xff0c;有幸去百度、字节面试&#xff0c;感觉大公司就是不一样&#xff0c;印象最深的是字节&#xff0c;所以有必要总结一下面试经验&#xff0c;以及面试中遇到的一些问题&…

腾讯云服务器和轻量服务器选哪个好(各自的优势区别)

腾讯云轻量服务器和云服务器CVM该怎么选&#xff1f;不差钱选云服务器CVM&#xff0c;追求性价比选择轻量应用服务器&#xff0c;轻量真优惠呀&#xff0c;活动 https://curl.qcloud.com/oRMoSucP 轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年&#xff0c;540元三…

Rust安装(Windows)

安装Rust 进入Rust官网&#xff0c;下载Rustup&#xff08;Rust安装器和版本管理工具&#xff09; 下载rustup-init.exe后双击运行&#xff0c;进入以下界面&#xff1a; 1&#xff09;通过 visual studio community 安装程序快速安装 2&#xff09;手动安装必备组件 3&#x…