目录
一. 摘要
这一周基本都在刷二分法的题,因此在这里做一个总结。二分法是我们耳熟能详的一种算法,其核心思想我认为就是6个字:缩小搜索范围。虽然思想简单,但是在实现的过程中却有很多细节需要注意。本文将对二分算法的原理,实现细节作简要的介绍,然后从leetcode中挑选一道题目来巩固练习。
二. 原理
二分算法的思想很简单,目的是通过缩小搜索范围以达到提高算法效率的目的。以“在数组中搜索一个目标数字”为例:
算法的步骤为:
- 中间的数(1号位置)是不目标值?
- 若不是目标值,则缩小目标区间。若该值比目标值大,则新的搜索范围为2号区域,否则为3号区域。、
- 不断迭代,直到找到目标值为止。
注意:使用二分法之前一定要注意!二分法只能用于有序数组中,因为他原理上是通过判断中间与目标值之间的某种关系来缩小范围,在关系缺失的前提下,算法即会失效。
三. 实现
1.程序的一般思路
我个人总结了写二分法程序的流程,如下图:
同样以”寻找数组中的目标值“为例,分析代码:
2. 细节处理
在写程序的过程中,二分法是很讲究细节的,主要包括以下四个方面。.
a. 左右边界的确定:
搜索区域的双边界一般定义为容器的两端,即:
int left = 0 //左边界
int right = nums.size()-1 //右边界
ps:有的算法喜欢把右边界定义为 nums.size(),如果写这一种做法的话后面循环条件,中心值修改都需要作修改。