二分总结:
一、搜索特定元素:在有序数组中用二分搜索一个数X,将起点终点分别定位L、R,找出中点值Y,若Y=X则直接输出ture,若Y≠X,则比较Y与X的大小关系,然后对有序数组进行砍半,在剩下的一半内继续使用二分法,直到查找到特定元素输出ture或无法在继续二分也未找到特定元素输出false。
二、搜索≥某数的最左位置:用-1表示不存在,定义ans=-1,对有序数组排序后进行二分搜索,若搜索到符合要求的值,则更新ans的值为该中点的位置数并向左对数组继续二分直至找到不满足的数或数组不可再二分,不再更新ans的值,并确定此时ans的值为≥某数的最左位置;若未搜索到符合要求的值,则不更新ans的值并向右继续二分直至找到符合要求的值再更新答案,此时ans的值便是≥某数的最左位置。(中≥num 记答案往左二分 ;中<num 不记答案往右二分)
求中点写法:1. m=(l+r)/2 写法不安全:怕溢出,即int有范围2^31-1,防止数组过长溢出导致输出结果为-1
2.m=l+(r-l)/2
3.m=l+((r-l)>>1)
三、与二相对,中≤num 记答案往右二分;中>num 不记答案往左二分
四、寻找峰值问题:二分法不止可用在有序组上,也可发生在无序数组上
从0号位到N-1号位的共N个数组成的数组,且任意相邻数不相等,默认0号位左侧和N-1号位右侧都为很小的数 1)确定0号位是否为峰值即确认1号位是否比0号位小,若是则返回0,若不是则继续
2)确认N-1号位是否为峰值即确认N-2号位是否比N-1号位小,若是则返回N-1,若不是则继续
3)取中间值,若中间值比两侧值大,则返回中间值,否则若左>中,往左侧二分;若右>中,往右侧二分(0号位和N--1号位都不是峰值则可保证0号位到一号位呈上升趋势,N-2号位到N-1号位呈下降趋势,故1号位到N-2号位中间一定有峰值,而左>中或右>中能保证一侧一定存在峰值,因此即使数组无序也同样适用)
五、时间复杂度分为一层循环、两层循环、多层循环。
解题思路:一层循环:1)列出循环趟数t及每轮循环i的变化值
2)找出i与t的关系
3)确定循环停止条件
4)联立两式求方程
5)写结果
二层循环:1)列出外层循环中i的变化值
2)列出内层语句的执行次数
3)求和,写结果
多层循环:以三层为例 方法一:抽象为计算三维体积
方法二:列式求和