leetcode題解-binary search題目總結

前面一段時間刷完了二叉搜索部分的題目,現在閒下來寫一個總結貼,主要針對這部分題目類型以及所使用的方法。

有序數組查找目標值索引

首先來說最簡單的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這道題目等)
  • 把二叉搜索當做子函數作爲一種判斷依據使用,每次循環中都使用其返回一個結果作爲下次循環的條件或者依據等

好多題目都忘了==又不想在重新刷一遍,所以這個總結寫的有點水,不過也給自己提個醒吧,以後在刷題的時候整個文件來記錄每道題的思路和點。這樣方便最後進行總結和回顧,好了,就先寫到這,以後慢慢在修改吧##

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章