力扣刷题(python)50天——第十五天:搜索旋转排序数组

力扣刷题(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。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值