leetcode NO.33 搜索旋转排序数组 白痴讲解 腾讯精选练习50

题目描述

在这里插入图片描述

这题我自己没想出来
下面贴上一个我觉得比较好理解的答案
https://leetcode-cn.com/problems/search-in-rotated-sorted-array/solution/sou-suo-xuan-zhuan-pai-xu-shu-zu-by-powcai/

首先我们要读懂题目,虽然我读了很久才读懂是什么意思,这道题就是说有一个升序的数组1234567,现在从中间断开比如从3开始断开,变成(123) (4567),然后这两段数组互换位置(4567) (123),这个例子只是为了方便说明才用1234567,实际上只是一个升序的序列还可以是1 3 5 7 9 11 13,变成9 11 13 1 3 5 7,题目中把这个操作叫做旋转,我们要从这样一个拥有两段升序的序列中找到目标值,而且时间复杂度在O(logN),log(N)其实就提示我们要用二分法了

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        if not nums:return -1
        n = len(nums)
        left = 0
        right = len(nums) - 1
        while left < right:
            mid = left + (right - left) //2
            if nums[mid] > nums[right]:
                left = mid + 1
            else:
                right = mid
        t = left
        left = 0
        right = len(nums) - 1
        while left <= right:
            mid = left + (right - left) //2
            realmid = (mid + t) % n
            if nums[realmid] == target:
                return realmid
            elif nums[realmid] > target:
                right = mid - 1
            else:
                left = mid + 1
        return -1

首先大家要分成两部分来看,分界线在

t = left

这句话的前后
这句话之前的代码是在说如何找到那个落差的位置,用1234567的例子4567123就是找到71这个落差的位置,实际上t是1的下标,也就是t是这个序列4567123最小值的下标。大家可以推一下为什么t是1的下标而不是7的下标(因为最后一轮还是left+1了)
找到这个t值,用的是二分查找,时间复杂度是log(N)

这个t值有什么意义呢,我们可以理解成1234567这个序列往→推了t步
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值