LeetCode 33 搜尋旋轉排序陣列 Python
阿新 • • 發佈:2019-02-15
LeetCode 33 搜尋旋轉排序陣列
題目描述:
假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [0,1,2,4,5,6,7]
可能變為 [4,5,6,7,0,1,2]
)。
搜尋一個給定的目標值,如果陣列中存在這個目標值,則返回它的索引,否則返回 -1
。
你可以假設陣列中不存在重複的元素。
你的演算法時間複雜度必須是 O(log n) 級別。
示例 1:
輸入: nums = [4,5,6,7,0,1,2]
, target = 0
輸出: 4
示例 2:
輸入: nums = [4,5,6,7,0,1,2]
, target = 3
輸出: -1
思路如下:
- 設定三個指標分別指向list的頭、中、尾
- 考慮特殊情況,即list中只有一個值時的情況
- 頭指標小於尾指標時執行迴圈
- 考慮若頭指標緊挨著尾指標時的情況(此時mid==left or mid==right),根據不同情況返回值
- 根據target是否等於頭、中、尾三個指標所指向的值。若是,返回結果
- 下面利用二分法縮短搜尋範圍:首先判斷頭指標指向數值至中指標指向數值是否構成升序序列。若是,繼續判斷target是否在這個升序序列中;若否,則說明旋轉點位於mid的左側(此時mid至right構成升序序列),進而判斷target是否在mid至right的升序序列中
程式碼如下:
class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ left=0 right=len(nums)-1 if len(nums)==1 and nums[0]==target: return 0 while left<right: mid=(left+right)/2 if right-left==1: if target==nums[left]: return left if target==nums[right]: return right else: return -1 if target==nums[left]: return left if target==nums[right]: return right if target==nums[mid]: return mid if nums[mid]>nums[left]: if target>nums[left] and target<nums[mid]: right=mid-1 else: left=mid+1 else: if target>nums[mid] and target<nums[right]: left=mid+1 else: right=mid-1 return -1