二分法的使用

适合二分求解的问题


在看二分查找之前,需要先强调一下,数组和函数等价,即f(x) 等价于num[x],都是映射关系,根据一个x值可以得到唯一一个函数值。这里的函数不仅指数学函数,也值自定义的表现为y = f(x) 的函数。
二分查找通常用来处理函数值单调,且容易判断的问题。例如在有序数组中查找值。
无论什么形式的二分,整体思想都是将有序集分为不可行解集和可能解集,不断缩小可能解集范围得到答案。


二分查找

有序集中寻找满足条件的值

例: 数组中找值


买家卖家问题

在有序集中查找第一次或者最后一次出现的值
1. lower_bound(begin,end,index):在数组中的[begin,end)前闭后开区间内,返回大于或等于index的第一个元素位置,如果都小于index,则返回end。
2. upper_bound(begin,end,index):在数组中的[begin,end)前闭后开区间内,返回大于index的第一个元素位置,如果都小于index,则返回end。
例: 00001111中找最后一个的 0 或一个 1,矩形分割LeetCode_278. 第一个错误的版本


二分答案

可能的解的集合具有单调性,而且容易判定集合中的值是否是可行的,可以先二分答案,得到该值是否是可行解,最后用买家卖家问题思路二分求得最优解。
大多数情况下用于求解满足某种条件下的最大(小)值。
例:LeetCode_3. 无重复字符的最长子串木材加工


二分特殊情况

函数左侧具有单调性,右侧也具有单调性,但整体不具有单调性,查找两个区间中间区间
例: [1, 2, 4, 3, 4, 2, 1]中找中间的3


猜你喜欢

转载自blog.csdn.net/skange/article/details/81322030