========坚持30天刷leetcode=====
题目链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array/
啊,思路不行,做得像条dog一样。一看优秀题解,就简单两步:
1)找到数组旋转的下标,也就是数组中最小元素的位置,用二分查找;
若nums[mid]<nums[mid+1],找到转折点;
若否,通过比较nums[mid] 和 数组左右边界的大小:
nums[left]<nums[mid],则left=mid+1;
否则,right=mid-1
2)在选中的数组区域中再次使用二分查找。
我的方法:
class Solution:
def search(self, nums: List[int], target: int) -> int:
nlen=len(nums)
if nlen==0: # 边界情况:数组空
return -1
i=0
j=nlen-1
if i==j: # 边界情况:数组仅一个元素
if nums[i]==target:
return i
else:
return -1
if nums[i]<nums[j]: # 选定局部数组有序,直接二分
# 二分
mid=int((i+j)/2)
#print(nums,mid)
if nums[mid]==target:
return mid
elif nums[mid]>target:
l=self.search(nums[i:mid],target)
#print(nums[i:mid],i,mid-1,l+i)
return l+i if l>=0 else l
else:
r=self.search(nums[mid+1:j+1],target)
#print(nums[mid+1:j],mid+i,j,r+mid+1)
return r+mid+1 if r>=0 else r
else: # 算是两个二分,想到了归并排序的思想
mid=int((i+j)/2)
#print(mid)
if nums[mid]==target:
return mid
else:
l=self.search(nums[i:mid],target)
l= l+i if l>=0 else l
r=self.search(nums[mid+1:j+1],target)
r= r+mid+1 if r>=0 else r
#print(nums,i,j,l,r)
return l if l > r else r