二分查找的實際應用————從leetcode第35題說起

下面是leetcode第35題,難度easy:
給定一個排序數組和一個目標值,在數組中找到目標值,並返回其索引。如果目標值不存在於數組中,返回它將會被按順序插入的位置。

你可以假設數組中無重複元素。

示例 1:
輸入: [1,3,5,6], 5
輸出: 2

示例 2:
輸入: [1,3,5,6], 2
輸出: 1

示例 3:
輸入: [1,3,5,6], 7
輸出: 4

示例 4:
輸入: [1,3,5,6], 0
輸出: 0

這道題題目非常簡單明瞭,並且已經給了我們前提條件:排序數組,讓我們找到一個key或者不存在的情況下找到它的插入位置,我們可以很快反應到,這就是一個最基礎的二分查找算法,實際上,這道題的代碼實現跟二分查找基本一模一樣,我要在這裏寫的並不是二分查找的一個邏輯,二分查找的具體算法實現可以看我的這篇文章:點擊此處查看
這道題中跟二分查找不同的地方在於假如我們找不到key,那我們需要找到這個key應該插入的位置,這是一個非常有意思的點,我們就從這裏切入來看看二分查找一些有意思的地方。
我們要是學習過二分查找後我們會明白,mid(二分查找中的中點指針)隨着二分查找的進行會一直向我們的key的位置靠近,要是在數組中存在key的話,那最後mid一定會指向key,然後結束程序。但是假如不存在key呢?
假如不存在key,對於一個升序數組(數組中的數字按照從小到大排列),一共有下面這兩種情況(相等的情況剛纔已經提到):
1.最後的key比最後的num[mid]大
2.最後的key比最後的num[mid]小
可能大家看到這裏還不是很理解,那麼我們舉個例子:
對於一個數組[2,4,6,8] key分別等於7和3,根據二分查找:
當key=7時,
第一次mid=1,第二次mid=2,第三次mid=3,此時指向8這個元素,由於7比8小,所以要進行的操作是high=mid-1,此時high=2,low=3,跳出循環,程序結束。
此時low的值便是我們想要的key的插入位置。
當key=3時,
第一次mid=1,第二次mid=0,此時mid指向元素2,由於3比2大,所以要執行操作low=mid+1,此時low=1,high=0,跳出循環,程序結束。
此時low的值便是我們想要的key的插入位置。
看到這裏,我們好像恍然大悟,這個low便是我們最後要的結果位置,我們來仔細思考一下,這是爲什麼,首先,二分查找到最後一定會找到一個位置,此時low=high,例如剛纔題中的元素8和元素2所在的位置,此時我們的key可能比這個元素小,也可能比這個元素大,假如比這個元素小,我們目標位置就是當前這個元素的位置,此時low不會變,也指向當前這個目標元素。
假如比這個元素大,我們的目標元素位置是當前的元素位置+1的位置,此時low根據代碼會+1,因爲low要朝向key移動,也是剛好等於我們要插入的位置。
綜上
最後還有一個問題問大家,當我們這個數組是一個從大到小排序的數組時,這時結論又是什麼呢,大家可以自己算一下
(答案還是low)

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