leetcode 33 解題報告:對於排序之後的資料結構,二分查詢是不二法則。本題的關鍵就在於如何針對旋轉之後的排序陣列進行二分查詢。考慮到陣列中沒有重複元素(注意這一前提十分關鍵),可以提供兩種思路:
1、兩次二分查詢:第一次二分查詢的目標是找出陣列具體在哪個位置做了旋轉,這個可以簡單地通過比較nums[mid]和它的相鄰元素的大小實現。第二次二分查詢就簡單了:先判斷待查詢值在左半部分還是右半部分,然後呼叫普通的二分查詢進行查詢。
2、一次二分查詢:由於陣列中沒有重複元素,所以思路1中的第一次二分查詢其實是不必要的。設中位數為nums[mid],則一次二分查詢的思路如下:
1)如果nums[mid] == target,則直接返回mid;
2)如果nums[mid] < nums[right],則說明從mid到right之間是嚴格遞增的。此時可以方便地判斷target是否在這一遞增區間內:如果是,則在這一遞增區間內查詢;否則就在另外乙個遞增區間內找。
3)如果nums[mid] > nums[right],則說明從left到mid之間是嚴格遞增的。此時可以方便地判斷target是否在這一遞增區間內:如果是,則在這一遞增區間內查詢;否則就在另外乙個遞增區間內找。
注意在下面的**中,即使已經判斷出某一區間為嚴格遞增區間了,我們還是用了自己設計的針對旋轉排序陣列的查詢方法。事實上,此時我們可以直接呼叫標準的二分查詢方法,速度應該會更快一些(建議讀者自己設計並實現)。
**:
class solution
else if(nums[mid] < nums[right]) // the right part is increasing
else // the left part is increasing
}return -1;
}};如果允許陣列中有重複元素呢?此時就不能通過判斷相互大小每次使搜尋空間減半了。具體解法請參考leetcode 81。
leetcode33 搜尋旋轉排列陣列
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...
LeetCode 33 搜尋旋轉排序陣列
假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1。你可以假設陣列中不存在重複的元素。你的演算法時間複雜度必須是 o log n 級別。示例...
leetcode 33 搜尋旋轉排序陣列
leetcode 33.搜尋旋轉排序陣列 假設按照公升序排序的陣列在預先未知的某個點上進行了旋轉。例如,陣列 0,1,2,4,5,6,7 可能變為 4,5,6,7,0,1,2 搜尋乙個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 1 你可以假設陣列中不存在重複的元素。你的演算法時...