33. Search in Rotated Sorted Array

25 年 8 月 26 日 星期二
287 字
2 分钟

33. Search in Rotated Sorted Array

Screenshot 2025-08-26 at 4.07.23 pm
python
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        def bisearch(l, r, target):
            while l <= r:
                mid = (l + r) // 2
                v = nums[mid]
                if v < target:
                    l = mid + 1
                else:
                    r = mid - 1
            if l == n:
                return -1
            if nums[l] != target:
                return -1
            return l
        n = len(nums)
        left, right = 0, n-2
        while left <= right:
            mid = (left + right) // 2
            v = nums[mid]
            if v < nums[-1]:
                right = mid-1
            else:
                left = mid + 1
        min_num_i = left
        if nums[-1] < target:
            # 在左半边
            return bisearch(0, min_num_i, target)
        elif nums[-1] > target:
            return bisearch(min_num_i, len(nums)-1, target)
        else:
            return n-1

两次二分:

找到旋转数组中的最小值

python
        n = len(nums)
        left, right = 0, n-2
        while left <= right:
            mid = (left + right) // 2
            v = nums[mid]
            if v < nums[-1]:
                right = mid-1
            else:
                left = mid + 1
        min_num_i = left

找到第一个>= target的数

python
        def bisearch(l, r, target):
            while l <= r:
                mid = (l + r) // 2
                v = nums[mid]
                if v < target:
                    l = mid + 1
                else:
                    r = mid - 1
            if l == n:
                return -1
            if nums[l] != target:
                return -1
            return l

和最后一个数比较,判断target在哪一个区域,对该区域应用二分

python
        min_num_i = left
        if nums[-1] < target:
            # 在左半边
            return bisearch(0, min_num_i, target)
        elif nums[-1] > target:
            return bisearch(min_num_i, len(nums)-1, target)
        else:
            return n-1

文章标题:33. Search in Rotated Sorted Array

文章作者:Sirui Chen

文章链接:https://blog.siruichen.me/posts/33_search_in_rotated_sorted_array[复制]

最后修改时间:


商业转载请联系站长获得授权,非商业转载请注明本文出处及文章链接,您可以自由地在任何媒体以任何形式复制和分发作品,也可以修改和创作,但是分发衍生作品时必须采用相同的许可协议。
本文采用CC BY-NC-SA 4.0进行许可。