Leetcode 33. Search in Rotated Sorted Array

本文介绍了一种在旋转过的有序数组中使用改进的二分查找法寻找特定目标值的方法。通过判断目标值可能位于的有序部分,实现了算法的时间复杂度为O(log n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Suppose an array sorted in ascending order is rotated at some pivot unknown to you beforehand.

(i.e., [0,1,2,4,5,6,7] might become [4,5,6,7,0,1,2]).

You are given a target value to search. If found in the array return its index, otherwise return -1.

You may assume no duplicate exists in the array.

Your algorithm's runtime complexity must be in the order of O(log n).

Example 1:

Input: nums = [4,5,6,7,0,1,2], target = 0
Output: 4

Example 2:

Input: nums = [4,5,6,7,0,1,2], target = 3
Output: -1

有序数组中找某个数,二分查找。但是这题中,数组中有序的有两部分,并不确定target会落在那一部分,所以思路是首先判断target会在哪一部分,再二分查找。

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        start=0
        end=len(nums)-1
        while start<=end:
            mid=(start+end)//2
            if nums[mid]==target:
                return mid
            elif nums[mid]<nums[end]:
                if nums[mid]<target and nums[end]>=target:
                    start=mid+1
                else:
                    end=mid-1
            else:
                if nums[start]<=target and nums[mid]>target:
                    end=mid-1
                else:
                    start=mid+1
        return -1

mid有两种可能,在前面的有序中或在后面的有序中。首先判断nums[mid]<nums[end],中间小于最右,说明mid在右面较小的序列中,判断target是否在这里,nums[mid]<target<=nums[end],在的话start移到mid+1,不在的话end移到mid-1位置。如果mid不在右面那么就在左边较大的序列中,判断nums[start]<target<nums[mid]。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值