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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路解析
首先注意到题目要求查找元素的算法时间复杂度为 O ( l o g N ) O(logN) O(logN),马上想到的是二分查找,但是二分查找的适用情况是有序序列,而在这道题中序列的顺序被翻转了一下,但并不是完全打乱顺序。虽然顺序被翻转了,但是我们观察到不管怎么翻转,序列总是由两个有序序列组成,我们完全可以把问题分解为在两个有序序列中查找元素的问题。那么问题的关键就在于如何确定这两个有序的序列。
同样,我们也可以观察到,通过比较中间元素与左边界元素的大小,就可以确定中间元素的哪一边为一个有序序列,而相应的另一边则可能是有序序列也可能是无序序列。
如果我们要查找的元素在有序序列部分,那么按照二分查找的思路很快就能确定索引。而如果我们要查找的元素在可能为无序序列的部分时,与处理原序列的思路相同,将这个序列部分,通过比较中间元素与左边界,确定有序部分与可能无序部分,按照同样的思路处理即可(while循环)。
class Solution:
def search(self, nums: List[int], target: int) -> int:
if nums == [] or nums is None:
return -1
low = 0
high = len(nums) - 1
while low < high:
mid = (low + high) >> 1
if nums[mid] >= nums[low]:
if nums[mid] > target and target > nums[low]:
high = mid - 1
elif nums[mid] == target:
return mid
elif nums[low] == target:
return low
else:
low = mid + 1
elif nums[mid] <= nums[low]:
if nums[mid] < target and target < nums[high]:
low = mid + 1
elif nums[mid] == target:
return mid
elif nums[high] == target:
return high
else:
high = mid - 1
return low if nums[low] == target else -1
注意边界条件。