本文準備講解1個簡單的算法編程問題, 這個算法編程問題來自LintCode平臺。不了解.LintCode平臺的讀者可以閱讀筆者文章(在線編程平臺推薦-LeetCode)。問題的英文版本描述如下:
First Position of Target
For a given sorted array (ascending order) and a target number, find the first index of this number in O(log n) time complexity.
If the target number does not exist in the array, return -1.
Example
If the array is [1, 2, 3, 3, 4, 5, 10], for given target 3, return 2.
? 問題的中文版本描述:
二分查找
給定一個排序的整數數組(升序)和一個要查找的整數 target,用O(logn)的時間查找到 target 第一次出現的下標(從0開始),如果 target 不存在于數組中,返回-1。
樣例
在數組[1, 2, 3, 3, 4, 5, 10]中二分查找3,返回2。
? 剛好JAVA語言支持對數組的二分查找,所以這個問題很有價值。JAVA語言自帶的數組二分查找函數無法支持數組中有重復數據的狀況,當數組中有重復數據時,自帶函數不保證返回的返回值為需要的目標數據數組下標號。比如對樣例數組,查找3返回3;而不是題目需要的2。為了處理重復數據的問題,必須對經典二分查找算法做改造。關鍵的算法為:找到目標數據后,不能中斷查找算法;繼續尋找數組下標號最小的目標數據項。
? 算法的代碼列表如下:
? 現在公布1種高效的算法方案,該方案對應 LintCode 平臺表現更強。