
🔥草莓熊Lotso:个人主页
❄️个人专栏:《C++知识分享》《Linux 入门到实践:零基础也能懂》
✨生活是默默的坚持,毅力是永久的享受。
🎬博主简介:

聚焦算法题实战,系统讲解三大核心板块:优选算法:剖析动态规划、二分法等高效策略,学会寻找“最优解”。 递归与回溯:掌握问题分解与状态回退,攻克组合、排列等难题。 贪心算法:理解“局部最优”到“全局最优”的思路,解决区间调度等问题 内容以题带点,讲解思路与代码实现,帮助大家快速提升代码能力。

二分查找(Binary Search),也称为折半查找,是一种高效的有序数组查找算法。其核心思想是通过不断将搜索区间减半,快速缩小目标值的可能范围,最终找到目标值或确定其不存在。该算法的时间复杂度为 O(log n),远优于顺序查找的 O (n),在处理大规模有序数据时优势显著

题目链接:
题目描述:

题目示例:

定义 left,right指针,分别指向数组的左右区间。
找到待查找区间的中间点 mid ,找到之后分三种情况讨论:
当 left 与 right 错开时,说明整个区间都没有这个数,返回 -1;
class Solution {
public:
int search(vector<int>& nums, int target) {
int left=0,right=nums.size()-1;
while(left<=right)
{
int mid=left+(right-left)/2;//防止数据溢出
if(nums[mid]<target) left=mid+1;
else if(nums[mid]>target) right=mid-1;
else return mid;
}
return -1;
}
}; int left=0,right=nums.size()-1;
while(left<=right)
{
int mid=left+(right-left)/2;//防止数据溢出
if(……………………)
left=mid+1;
else if(…………………………)
right=mid-1;
else return …………………………;
}笔记字有点丑,大家见谅:


题目链接:
题目描述:

题目示例:

算法思路:
用的还是二分思想,就是根据数据的性质,在某种判断条件下将区间一分为二,然后舍去其中一个区间,然后再另一个区间内查找;
方便叙述,用 x 表示该元素,resleft 表示左边界,resright 表示右边界。
寻找左边界思路:
寻找左边界:我们需要注意到以左边界划分的两个区间的特点
因此,关于 mid 的落点,我们可以分为下面两种情况:
由此,就可以通过⼆分,来快速寻找左边界;
注意:这里找中间元素需要向下取整。
因为后续移动左右指针的时候:
因此⼀定要注意,当 right = mid 的时候,要向下取整。
寻找右边界思路:
寻右右边界: 用resRight 表示 右边界, 我们注意到右边界的特点:
因此,关于 mid 的落点,我们可以分为下面两种情况:
由此,就可以通过⼆分,来快速寻找右边界;
注意:这里找中间元素需要向上取整。
因为后续移动左右指针的时候:
因此⼀定要注意,当 right = mid 的时候,要向下取整。
class Solution {
public:
vector<int> searchRange(vector<int>& nums, int target) {
int begin=0,end=0,mid=0;
if (nums.empty())
{
return {-1, -1};
}
//1.查找区间左端点
int left=0,right=nums.size()-1;
while(left<right)
{
mid=left+(right-left)/2;
if(nums[mid]<target) left=mid+1;
else right=mid;
}
if(nums[left]==target) begin=left;
else return{-1,-1};
//2.查找区间右端点
left=0,right=nums.size()-1;
while(left<right)
{
mid=left+(right-left+1)/2;
if(nums[mid]<=target) left=mid;
else right=mid-1;
}
if(nums[right]==target) end=right;
else return{-1,-1};
return{begin,end};
}
};笔记字有点丑,大家见谅:


二分查找算法总结:
请大家⼀定不要觉得背下模板就能解决所有⼆分问题。⼆分问题最重要的就是要分析题意,然后定
要搜索的区间,根据分析问题来写出二分查找算法的代码。 要分析题意,确定搜索区间,不要死记模板,不要看左闭右开什么乱七⼋糟的题解
模板记忆技巧:
往期回顾:
《算法闯关指南:优选算法--滑动窗口》--15.串联所有单词的子串,16.最小覆盖子串
结语:本文系统讲解了二分查找算法及其应用。首先介绍了二分查找的基本原理,即通过不断对半缩小搜索范围,在有序数组中高效查找元素,时间复杂度为O(logn)。接着以LeetCode 704题为例,详细解析了标准二分查找的实现步骤和代码模板。然后进阶讲解了34题中查找元素边界位置的二分变种,重点分析了左边界和右边界查找的不同策略及注意事项,包括mid取整方式的差异。
✨把这些内容吃透超牛的!放松下吧✨ ʕ˘ᴥ˘ʔ づきらど