二分法这一章,做题时的难度明显感觉要高于前几章
专题要点:
对二分思想的掌握与运用是这一专题的要点,个人认为,理解二分思想中的二分取值(即left,right,mid),二分判断条件(mid > key, mid < key, mid == key),二分的循环条件(left < right, left <= right),二分的返回值(return left/right, return mid)尤为重要!!!可以自己先问一下自己,这几点是否完全明白,而非模棱两可。
二分思想:
1、二分前提:二分法运用的前提条件即为有序性,因此在做题时,如果有明显的有序性,可以考虑二分法,若无明显的有序性,考虑能否将数据转化为有序的(排序或进行一些运算,比如计算自序和的运算)
2、二分取值:left,right作为区间的两个端点,根据二分判断条件进行左右移动;mid作为中点主要是用来标出要查找数据的位置,并进行二分判断的
3、二分判断条件,二分循环条件与二分返回值可以根据查找目的不同,分为两种查找方式:
①查找满足相等关系的元素是否存在
二分判断条件:由于查询元素是否存在,含义是存在返回下标,不存在则需要指明查询失败,因此需要对mid和key的大于关系,小于关系,等于关系分别处理
二分循环条件:left <= right,出现left>right的情况跳出循环,这种情况发生于当left,mid,right指向同一个数时,这个数还不是目标值,则left>right,则整个查找结束返回-1
二分返回值:若元素存在,则mid==key条件成立,返回mid,若元素不存在,出现left > right,跳出循环,返回-1
int binarySearch(int left, int right, int key)
{
while(left <= right)
{
mid