LeetCode:33. Search in Rotated Sorted Array
Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.
(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.
Your algorithm's runtime complexity must be in the order of O(log n).
Example 1:
Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4
Example 2:
Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1
就是有一个升序排列的数组,但是它从某个位置截成两半并交换了两部分的位置。要从它这里面找到目标值,存在则返回该值所处位置,否则返回-1。同事要求时间负责度不超过O(log n)。
思路:二分查找
由于限制了时间,所以不能遍历查找。先考虑一下二分查找。由于数组不是原来的升序,但是两部分内部还是有序的。原始二分查找的方法是查找时只继续查找符合条件的一部分,而我们这里,两部分都要执行二分查找。
class Solution:
def searchPart(self, nums: List[int], left,right,target: int) -> int:
l = len(nums)
ans = -1
if l == 0:
return ans
if left == right:
if nums[left] == target :
return left
else:
return ans
mid = (int)((left+right)/2)
if nums[mid] == target:
ans = mid
else:
if left < mid :
l_ans = self.searchPart(nums,left,mid-1,target)
if l_ans != -1:
ans = l_ans
if mid < right:
r_ans = self.searchPart(nums,mid+1,right,target)
if r_ans != -1:
ans = r_ans
return ans
def search(self, nums: List[int], target: int) -> int:
return self.searchPart(nums, 0, len(nums)-1, target)
这里定义了一个 searchPart()
方法,查找时同时对mid两边执行。
THE END.