题目描述
假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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
算法思路
问题核心在于算法复杂度,如何得到log n级别的时间复杂度。——这里很容易想到二分查找法。
二分查找法:对一个长度为n的有序数组,每次取中位数与所需数字对比。二分一次得到n/2,两次是n/4,三次是n/8,如果每次中位数都不是所需数字,则二分到1.
那么语句执行的次数就是二分的次数。
设次数为x, n ∗ ( 1 2 ) x , x = l o g 2 n n*(\frac{1}{2})^x,x=log2^n n∗(21)x,x=log2n
完整算法
class Solution:
def search(self, n, t: int) -> int:
a,b=0,len(n)-1
while a<=b:
mid=(a+b)//2
if n[mid]==t:return mid
if n[a]<=n[mid]:#左边升序
if n[a]<=t<=n[mid]:b=mid-1
else:a=mid+1
else :#右边升序
if n[mid]<=t<=n[b]:a=mid+1
else:b=mid-1
return -1
执行用时 :32 ms, 在所有 Python3 提交中击败了96.69%的用户
2020/04/27打卡
我第一次刷这道题肯定看答案了,不然我不能接受这次为什么我居然写出了这种答案:
class Solution:
def search(self, nums, target: int) -> int:
def helper(l,r,target):
if r<l:return -1
if nums[r]<target<nums[l]:return -1
while l<=r:
mid=(l+r)//2
if nums[mid]==target:return mid
if nums[mid]<nums[r]:
if nums[mid]<target<=nums[r]:
l=mid+1
else:
return helper(l,mid-1,target)
else:
if nums[l]<=target<nums[mid]:
r=mid-1
else:
return helper(mid+1,r,target)
return -1
return helper(0,len(nums)-1,target)
执行用时 :36 ms, 在所有 Python3 提交中击败了89.80%的用户