最近重新開始學習算法,因為覺得這個一個本質的思想性的東西,無論何時,都可以從此收益,于是打算記錄一下自己學習算法的一些體會。
二分法應該算是算法里最基本的一種方法了,常用于在一個有序數組中查找某個值第一次出現的位置、最后出現的位置、或者是一段區間。
有序數組中如果用暴力的貪心算法,即遍歷,時間復雜度是O(n)。
用二分法后,由于每次可以去掉一半無用的區間,會將時間復雜度減少到O(logn)。
二分法的基本做法是:
1、確定要查找的區間。
2、確定要二分時的參照點。
2、區間內選取二分點。
3、根據二分點的值,綜合左右區間情況以及求解的目的,舍去一半無用的區間。
4、在有用的區間繼續進行二分搜索。
下面是幾道比較經典的題目:
1、給定一個升序數組以及一個目標整數target,返回target首次出現的下標位置,如果不存在返回-1。
此題目已給定升序數組,所以待求區間確定,第一步就可省略了。
Paste_Image.png
2、同樣是上面的題目,條件變換一下,即給定的數組可以想想為無窮大,但是你可以通過get_value($key)來獲取某個下標下的值,求target第一次出現的位置。
此時相當于給定的區間不確定了,所以你先要鎖定一個求解區間,增加代碼如下:
Paste_Image.png
3、假設一個旋轉排序的數組其起始位置是未知的(比如0 1 2 4 5 6 7可能變成是4 5 6 7 0 1 2)。你需要找到其中最小的元素。你可以假設數組中不存在重復的元素。
Paste_Image.png
如上圖旋轉排序數組有以下兩種情況,兩種情況下最小元素都是小于數組中最后一個元素的,所以可以把數組最后一個元素的值當做參考點。
Paste_Image.png