主要讲了按值二分搜索和扫描线。按值二分很好理解,扫描线的想法能解决一系列题目,基本想法就是把start point 和 end point都加入到一个list里,然后再排序,然后通过一根垂直的扫描线从左到右扫一遍,每遇到一个点就处理一次。
1. Sqrt(x): 典型的按值二分
2. Maximum Average Subarray: 最大的均值肯定在min(nums)和max(nums)之间,也就是说这是按值搜索的上限和下限。但是在确定条件的时候比较tricky,利用前缀和数组找到是否存在一个sum[j] > sum[i] i in range(0, j-k+1) and j>=k,如果能找到的话,说明当前这个mid找小了,更新左边界,否则更新右边界
3. Number of Airplanes in the Sky: 利用扫描线很容易解决
4. Divide Two Integers: 找divisor的个数的时候,每次二倍速的递增被减数。
5. Find Peak Element: 那其中某个边界做基准,然后二分法
6. First Bad Version: 简单的二分法
7. Find Peak Element II: 先找中间一行的最大值,然后可以知道在上半区还是下半区,然后找那个最大值的左右半区,依次找下去就可以了
8. Wood Cut: 砍木头,左边届是0右边界是max(wood)
9. Copy Books: 最小值是左边界,最大值是右边界,然后就是二分法,条件是copy完所有的书所需要的人小于分配的人数
10. Sqrt(x) II: 左边届和右边届的差值设置为0.000001这样
11. Find the Duplicate Number: 二分法,判断条件是数array中比mid小的元素的个数
12. Smallest Rectangle Enclosing Black Pixels: 以给定点为某一个边界,然后搜索(0, x), (x, m-1), (0, y), (y, n-1),也就是说因为全部都是连通域,所以这些点在x轴上和y轴上的投影也必定是连续的点