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

相關文章
相關標籤/搜索