Description
- Search in Rotated Sorted Array medium
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
-
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
题目大意
在一旋转排序数组中找target目标值所对应的下标,若不存在则返回-1
假设不存在重复的target值,且要求时间复杂度为O(log n)。
解题思路1
刚看到这题就想用enumerate遍历一遍就能实现,看到要求O(log n)以为会超时,但还是试了一下没想到通过了。
code
class Solution:
def search(self, nums: List[int], target: int) -> int:
if target not in nums:
return -1
for i , val in enumerate(nums):
if target== val:
return i
解题思路2
但既然要求O(log n),二分法就可以满足。这里注意while的条件是low<=high,二分应该是可以取low=high 的,不然得不到正确结果。
code
class Solution:
def search(self, nums: List[int], target: int) -> int:
low = 0
high = len(nums)-1
while low <= high:
mid = int((high + low)/2)
if nums[mid] == target:
return mid
if nums[low] <= nums[mid]:
if nums[low] <= target and target < nums[mid]:
high = mid -1
else:
low = mid + 1
if nums[mid]<nums[high]:
if nums[mid] < target and target <= nums[high]:
low = mid + 1
else:
high = mid -1
return -1