Leetcode复习小结: Binary Search

Binary Search
Binary Search的题目我以前一直搞不清楚,一写就错,如今好了一些,总结下模版。
模版分红两种:
1、寻找某个指定的值,好比问数组中是否存在这个target,或者这个target的index是多少,对于这一种有三种模版:
1.lo <= hi数组

while (lo <= hi) {
                        int mid = (hi - lo) / 2 + lo;
                        if (mid == target)    return true;
                        if (mid < target)    lo = mid + 1;
                        else    hi = mid - 1;
                    }
                    return false;

2.lo + 1 < hi指针

while (lo + 1 < hi) {
                        int mid = (hi - lo) / 2 + lo;
                        if (mid == target)    return true;
                        if (mid < target)    lo = mid;
                        else    hi = mid;
                    }
                    return false;

3.lo < hicode

while (lo < hi) {
                        int mid = (hi - lo) / 2 + lo;
                        if (mid == target)    return true;
                        if (mid < target)    lo = mid + 1;
                        else    hi = mid;
                    }
                    return false;

2、不是寻找某一特定的值,而是找知足某条件的第一个值(有些题目虽然没有直接问第一个知足某条件的值,但能够转换成这种形式)。这种状况下上面的第三个模版最方便。排序

Java中自带的Arrays.binarySearch(nums, target)能够找到target在该数组中应该插入的位置,等价于寻找第一个大于等于该数的位置element

int lo = 0, hi = nums.length;
                    while (lo < hi) {
                        int mid = (hi - lo) / 2 + lo;
                        if (nums[mid] >= target)
                            hi = mid;
                        else    lo = mid + 1;
                    }
                    return lo;

经典的题目有:
4. Median of Two Sorted Arrays
33. Search in Rotated Sorted Array
81. Search in Rotated Sorted Array II
153. Find Minimum in Rotated Sorted Array
154. Find Minimum in Rotated Sorted Array II
在二维数组中binary search
74. Search a 2D Matrix(线性)
240. Search a 2D Matrix II(非线性)
binary search比较少见的应用(LIS问题)
300. Longest Increasing Subsequence
354. Russian Doll Envelopesleetcode

binary search在有些状况下能够替代hashmap的功能,在数组中查找某个数是否存在,固然前提条件是该数组已经排好序。binary search更多的用于替代Treemap的ceiling和floor功能,查找大于等于(大于)/小于等于(小于)某个数的最小/最大值。get

binary search的另外一种用法,以值做为搜索条件,好比某数组虽然没有排序,但知道数组元素的取值范围,这个时候就能够将取值范围做为binary search的搜索范围
378. Kth Smallest Element in a Sorted Matrix
287. Find the Duplicate Number(有快慢指针法)
410. Split Array Largest Sum(有dp解法)hash

若是题目是在一个二维矩阵中找到某个或某些知足条件的矩形,咱们能够先考虑若是相同的条件放在一维数组里面怎么作,而后把二维矩阵降维成一维数组进行处理。下面的代码是二维降一维:it

int m = matrix.length, n = matrix[0].length;
                    for (int l = 0; l < n; l ++) {
                        int[] sums = new int[m];
                        for (int r = l; r < n; r ++) {
                            for (int i = 0; i < m; i ++)
                                sums[i] += matrix[i][r];
                                ......
                                // 有了sums数组以后就能够用一维的方法处理了
                        }
                    }

这种类型的题目有:
363.Max Sum of Rectangle No Larger Than K
1074.Number of Submatrices That Sum to Targethashmap

相关文章
相关标签/搜索