一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第14天,点击查看活动详情。
这里主要通过三个问题来引出二分法的基本使用和扩展
问题1-经典二分
这个二分法最基本的使用,针对有序数组,以两等分方式递归找寻目标数字(通过比较二分值和目标值大小来选择下一次二分区间)
这里时间复杂度是以2为底对数,例如8个数字找1个,最多对半3次 log2^8 = 3
问题2-找某个区间的位置
看到有序,可以想一想二分算法,这里也是可以通过二分来解决的。
二分,判断二分值(这个位置通过index记录)和3关系,比3大或者等于3,去二分值左侧再二分,否则去右侧二分,同时通过一个变量记录3的最左侧变量位置,每一次二分值为3都进行此变量更新,然后一直递归直到没有数字为止。
问题3-局部最小值问题
这个有些难得
arr无序数组中,告诉你任何两个相邻数字一定不相等,然后定义局部最小:
求数组中任何一个局部最小的index位置,能不能有办法?-- 常规方式就是遍历,一个数一个数的判断是不是比左右都小来实现。
最好是时间复杂度为O(N)
思想:
首先需要了解不是有序才能采用二分
首先判断0和N位置是不是局部最小,不是那么数组趋势如上。
这时候直接取数组中间位置M,判断是不是局部最小,如果不是,看一下哪边是比M值小的趋势,例如左边M-1更小
接着只需要二分到死,重复上述方式必能找到局部最小,这就一种在无序数组中但是数据有规律可以甩掉一边情况下也是可以二分的