leet33. 搜尋旋轉排序陣列
阿新 • • 發佈:2018-11-10
題目:
假設按照升序排序的陣列在預先未知的某個關鍵點上旋轉。
(即 0 1 2 4 5 6 7
將變成 4 5 6 7 0 1 2
)。
給你一個目標值來搜尋,如果陣列中存在這個數則返回它的索引,否則返回 -1。
你可以假設陣列中不存在重複。
分析:
- 可以直接用庫函式index(),時間複雜度O(n);
- 旋轉的後果是列表不再是遞增列表,但列表依然有序,可以通過分情況討論採用二分法,時間複雜度O(lgn)
程式碼:
class Solution(object): def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ if not nums: return -1 l = 0 r = len(nums) - 1 while l < r: if r - l == 1: if target in nums: return nums.index(target) else: return -1 mid = (l + r) // 2 # print "l:%d,mid:%d,r:%d"%(l,mid,r) if nums[mid] == target: return mid if target > nums[mid]: if nums[r] < nums[mid]: l = mid + 1 else: if target > nums[r]: r = mid -1 else: l = mid + 1 else: if nums[mid] > nums[l]: if target < nums[l]: l = mid + 1 else: r = mid -1 else: r = mid - 1 # print 'r:%d' % r if nums[r] == target: return r return -1
思考:
- 考慮特殊情況,列表長度為2的情況,直接採用遍歷的方法,或使用index()庫函式
- 程式碼優於leetcode中97%的case