【algorithm】算法基础课---二分查找算法(附笔记 | 建议收藏)
🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:AcWing算法学习笔记
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn
文章目录
- 前言
- 一、二分查找的思想
- 二、二分查找的模板
-
- 1.寻找⼀个数(基本的⼆分搜索)
- 2.边界问题
- 3.寻找左侧边界的⼆分搜索
- 4.寻找右侧边界的⼆分查找
- 三、经典题目集
-
- 总结
前言
关于我写这篇博客的目的以及原因
其实很早前我就写过博客关于二分法,但是我是不满意的或是我觉得不完美的,于是寒假我又花费三天时间又学了一次,今天就把我所学到的经验和知识输出出来,以供复习和学习。
声明:这里知识基于算法小抄与深入浅出的程序设计两本书+AcWing算法课(侵权删)
提示:以下是本篇文章正文内容,下面案例可供参考
一、二分查找的思想
由于找一个数遍历的时间复杂度有些题目会超时,所以就需要一个更加优秀的算法—二分查找算法,其实二分算法可以将时间复杂度缩小到logN 想一想为什么?
那么废话不多说,下面就来讲二分查找的基本思想:
我们开始定义两个变量,left,right分别指向数组的左端点和右端点(这里会出现左闭右开以及都是闭区间的边界问题
,这个问题下面单独会讲解,大家不用着急)
利用数学上边的二分法就是一次检查一半,这样就可以一次去除一半的不符合要求的数据,大大加大了效率,通过不断地迭代,进而二分出正确答案。
二、二分查找的模板
1.寻找⼀个数(基本的⼆分搜索)
这个场景是最简单的,肯能也是⼤家最熟悉的,即搜索⼀个数,如果存在,
返回其索引,否则返回 -1。
这里再把二分模板的代码附上:
这里是一个左闭右开区间
//数组 //目标 //数组长度
int binarySearch(int* nums, int target, int size)
{//特殊情况,可以了解一下这里不计入模板 //if(nums==NULL||size==0)// return -1;int left=0,right=size-1;while(left<right){int mid=left+(right-left)/2;//防止溢出if(nums[mid]>=target) r=mid;else l=mid+1;}if(nums[left]!=target) return -1;else return left

🚀write in front🚀
📝个人主页:认真写博客的夏目浅石.
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:AcWing算法学习笔记
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🖊
✉️如果无聊的话,就来逛逛我的博客栈吧stack-frame.cn
文章目录
- 前言
- 一、二分查找的思想
- 二、二分查找的模板
-
- 1.寻找⼀个数(基本的⼆分搜索)
- 2.边界问题
- 3.寻找左侧边界的⼆分搜索
- 4.寻找右侧边界的⼆分查找
- 三、经典题目集
-
- 总结
前言

关于我写这篇博客的目的以及原因
其实很早前我就写过博客关于二分法,但是我是不满意的或是我觉得不完美的,于是寒假我又花费三天时间又学了一次,今天就把我所学到的经验和知识输出出来,以供复习和学习。
声明:这里知识基于算法小抄与深入浅出的程序设计两本书+AcWing算法课(侵权删)
提示:以下是本篇文章正文内容,下面案例可供参考
一、二分查找的思想
由于找一个数遍历的时间复杂度有些题目会超时,所以就需要一个更加优秀的算法—二分查找算法,其实二分算法可以将时间复杂度缩小到logN 想一想为什么?
那么废话不多说,下面就来讲二分查找的基本思想:
我们开始定义两个变量,left,right分别指向数组的左端点和右端点(这里会出现左闭右开以及都是闭区间的边界问题
,这个问题下面单独会讲解,大家不用着急)
利用数学上边的二分法就是一次检查一半,这样就可以一次去除一半的不符合要求的数据,大大加大了效率,通过不断地迭代,进而二分出正确答案。
二、二分查找的模板
1.寻找⼀个数(基本的⼆分搜索)
这个场景是最简单的,肯能也是⼤家最熟悉的,即搜索⼀个数,如果存在,
返回其索引,否则返回 -1。

这里再把二分模板的代码附上:
这里是一个左闭右开区间
//数组 //目标 //数组长度
int binarySearch(int* nums, int target, int size)
{//特殊情况,可以了解一下这里不计入模板 //if(nums==NULL||size==0)// return -1;int left=0,right=size-1;while(left<right){int mid=left+(right-left)/2;//防止溢出if(nums[mid]>=target) r=mid;else l=mid+1;}if(nums[left]!=target) return -1;else return left;
}
这里是一个左右都闭的方法
//数组 //目标 //数组长度
int binarySearch(int* nums, int target, int size)
{//特殊情况,可以了解一下这里不计入模板 //if(nums==NULL||size==0)//return -1;int left=0,right=size-1;while(left<=right){if(nums[mid] == target)return mid;else if (nums[mid] < target)left = mid + 1; // 注意else if (nums[mid] > target)right = mid - 1; // 注意}if(nums[left]!=target) return -1;else return left;
}
2.边界问题
1、为什么 while 循环的条件中是 <=,⽽不是 <?
因为初始化 right 的赋值