目录
题目链接
33. Search in Rotated Sorted Array
题目描述
判断旋转有序数组nums中是否存在元素target,如果存在返回target在数组中的索引,否则返回-1。nums中元素不重复。
约束条件:
1 <= nums.length <= 5000
-10^4 <= nums[i] <= 10^4
- All values of
nums
are unique. nums
is guranteed to be rotated at some pivot.-10^4 <= target <= 10^4
解决思路一
1、首先利用二分搜索算法确定旋转有序数组的旋转点pivot(可用模板二)。
2、根据target和nums[-1]的大小比较结果确定target是在左排序序列还是右排序序列,进而收缩搜索区间。
3、在左右区间内部再次用二分搜索寻找target(可用模板一)。
解决思路一Python代码
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
#首先确定pivot
while(left < right):
mid = (left + right) // 2
if(nums[mid] > nums[right]):
left = mid + 1
else:
right = mid
#left is the pivot
#确定target在哪个部分
if(target > nums[-1]):#target 在pivot左侧
left,right = 0,left-1
else:
left,right = left,len(nums) - 1
while(left <= right):
mid = (left + right) // 2
if(nums[mid] == target):
return mid
elif(nums[mid] > target): #
right = mid - 1
else:
left = mid + 1
return -1
解决思路二
这个方法不用判断pivot的位置,直接根据target和nums[mid]的相对位置来收缩搜索区间。其中target(如果存在)和nums[mid]的相对位置包括以下三种情况:
1、nums[mid]在左排序序列(nums[mid] > nums[right]),target在右排序序列(target <= nums[right])。
2、nums[mid]在右排序序列(nums[mid] < nums[right]),target在左排序序列(target > nums[right])。
3、nums[mid]和target同时在左排序序列或右排序序列,由于两个子序列都是升序序列,因此可以根据nums[mid]和target比较大小的结果收缩搜索区间。
解决思路二Python实现
class Solution:
def search(self, nums: List[int], target: int) -> int:
left = 0
right = len(nums)-1
while(left <= right):
mid = (left + right) // 2
if(nums[mid] == target):
return mid
if(nums[mid] > nums[right] and target <= nums[right]):#nums[mid] > nums[right]说明nums[mid]在左排序序列;target <= nums[right]说明target在右排序序列
left = mid + 1
elif(nums[mid] < nums[right] and target > nums[right]):#nums[mid]在右排序序列 target在左排序序列
right = mid - 1
else: #nums[mid]和target同时在左排序序列或右排序序列
if(nums[mid] > target):
right = mid - 1
else:
left = mid + 1
return -1