Leetcode篇:搜尋旋轉排序陣列
阿新 • • 發佈:2018-11-15
@author: ZZQ
@software: PyCharm
@file: search.py
@time: 2018/11/12 18:12
要求:假設按照升序排序的陣列在預先未知的某個點上進行了旋轉。
( 例如,陣列 [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
思路: 先找到陣列的旋轉位置,然後判斷該元素在旋轉的部分還是未旋轉的部分。
class Solution(): def __init__(self): pass def search_index(self, target, nums, start, end): left = start right = end-1 while left <= right: middle = (left + right) / 2 if nums[middle] == target: return middle - start + 1 elif nums[middle] < target: left = middle + 1 else: right = middle - 1 return -1 def search(self, nums, target): """ :type nums: List[int] :type target: int :rtype: int """ nums_len = len(nums) reverse_index = -1 if nums_len == 0: return -1 if nums_len == 1: if nums[0] == target: return 0 else: return -1 for i in range(nums_len-1): if nums[i] > nums[i+1]: reverse_index = i+1 # 在旋轉後的子數組裡面 if reverse_index != -1: if target < nums[0]: sub_index = self.search_index(target, nums, reverse_index, nums_len) if sub_index != -1: index = reverse_index-1 + sub_index else: index = -1 else: sub_index = self.search_index(target, nums, 0, reverse_index+1) if sub_index != -1: index = sub_index -1 else: index = -1 else: sub_index = self.search_index(target, nums, 0, nums_len) if sub_index != -1: index = sub_index - 1 else: index = -1 return index