力扣刷题(python)50天——第十五天:搜索旋转排序数组
题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。
搜索一个给定的目标值,如果数组中存在这个目标值,则返回它的索引,否则返回 -1 。
你可以假设数组中不存在重复的元素。
你的算法时间复杂度必须是 O(log n) 级别。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/search-in-rotated-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
方法
看到这熟悉的东西,左右两半,另外时间复杂度为logN,就想到之前找中位数的二分法。
先用二分法找到旋转的点位,处理后再用另一个二分在排序数组中找target。
解答
class Solution(object):
def search(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: int
"""
l = len(nums)
if not l:
return -1
elif l==1:
if nums[0]==target:
return 0
else:
return -1
r_max=nums[-1]
l_min=nums[0]
if r_max<l_min:
if r_max==target:
return l-1
left=0
right=l-1
while 1:
mid=(left+right)/2
if nums[mid]>nums[mid+1]:
break
else:
if nums[mid]>r_max :
left,right=mid,right
else:
left,right=left,mid
flag=0
r_min=nums[mid+1]
l_min=nums[0]
l_max=nums[mid]
if r_min<=target<=r_max:
flag=len(nums[:mid+1])
nums=nums[mid+1:]
elif l_min<=target<=l_max:
nums=nums[:mid+1]
else:
return -1
else:
flag=0
l=len(nums)
left=0
right=l-1
while right-left>1:
mid=(left+right)/2
if nums[mid]==target:
return mid+flag
if nums[mid]>target:
left,right=left,mid
if nums[mid]<target:
left,right=mid,right
if nums[left]==target:
return left+flag
elif nums[right]==target:
return right+flag
else:
return -1
执行结果
成绩出来吓到我,感觉有点玄学哈哈,不过内存占用挺高的
参考改进:
看了官方答案的思路,和我一样嘿嘿QWQ。。