【力扣】33:搜索旋转排序数组 | 二分查找

题目描述

假设按照升序排序的数组在预先未知的某个点上进行了旋转。
( 例如,数组 [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%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值