前面一段時間刷完了二叉搜索部分的題目,現在閒下來寫一個總結貼,主要針對這部分題目類型以及所使用的方法。
有序數組查找目標值索引
首先來說最簡單的binary-search,應用在有序數組查找target值等問題中,一般會有兩種解法,也就是binary-search問題中最關鍵的邊界問題和更新方案的區別,這裏推薦大家選擇一種自己喜歡的方案用就可以,不用同時記住兩種,反而會搞混,比如我都是用第一種:
public int searchInsert(int[] nums, int target) {
//high取數組長度減1
int low=0, high=nums.length-1, mid;
//循環條件是low<=high
while(low<=high){
mid = (low+high)/2;
//要有返回語句且high賦值爲mid-1
if(target == nums[mid])
return mid;
else if(target < nums[mid])
high = mid-1;
else
low = mid+1;
}
return low;
}
public int searchInsert1(int[] nums, int target) {
//high取數組長度
int low = 0, high = nums.length, mid;
//循環條件是low<high
while(low < high) {
mid = low + (high - low) / 2;
//沒有返回語句且high賦值爲mid
if(nums[mid] < target)
low = mid + 1;
else
high = mid;
}
return low;
}
其實要注意的就三個地方,high初始值,while循環條件以及high更新方案。自己選擇一套方案即可。
在這個基礎上,binary-search還有幾種變形,比如說尋找第一個大於或者小於target的值的索引,其實主要還是要找到邊界條件的判斷和更新方案,這部分的分析我們可以參考下面這個鏈接:
關於二分查找的總結
找到binary-search應用的點
說白了binary-search是一種加速算法時間複雜度的方法,本身並沒有什麼難度,重要的是如何理解題目,找到運用binary-search的地方。比如我們之前說到的有兩種binary search的思路,然後再加上一個:
- 對數組的索引進行二插搜索,看相應位置的元素是否滿足某種條件(基本用法)
- 直接對數組所有元素的範圍進行二叉搜索,然後檢查數組中所有元素是否滿足相應條件(需要自己進行設計檢查方法,比如378. Kth Smallest Element in a Sorted Matrix這道題目等)
- 把二叉搜索當做子函數作爲一種判斷依據使用,每次循環中都使用其返回一個結果作爲下次循環的條件或者依據等
好多題目都忘了==又不想在重新刷一遍,所以這個總結寫的有點水,不過也給自己提個醒吧,以後在刷題的時候整個文件來記錄每道題的思路和點。這樣方便最後進行總結和回顧,好了,就先寫到這,以後慢慢在修改吧##