Leetcode 33. 搜索旋转排序数组

在这里插入图片描述

心路历程:

这道题的核心在于"如果左半段递增则一定nums[l] < nums[mid]"这个充要条件,并且右半段是没法根据这一点进行判断的,每次在二分搜索中,只需要判断target是否落入递增区间即可.

二分法思想核心:
target一定在这个里面
否则target一定在另外一边

注意的点:

1、建议全部按照闭区间去思考二分法, 这样每次更新l, r都是按照+1 -1 去更新,防止出现死循环
2、这道题最好按照左侧数组上升还有右侧数组上升的情况进行判断, 否则else的条件判断会十分复杂

解法: 二分搜索

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        n = len(nums)
        # 二分查找法; 这道题只能判断左侧是不是上升
        l, r = 0, n -1
        while r >= l:  # 这里用等号可以避免最后再去判断 nums[l] == target
            print(l, r)
            mid = (l + r) // 2
            if nums[mid] == target:
                return mid
            if nums[mid] >= nums[l]:  # 代表数组左侧上升
                if nums[l] <= target < nums[mid]: r = mid - 1
                else: l = mid + 1
            else:  # 代表右侧数组上升
                if nums[mid] < target <= nums[r]: l = mid + 1
                else: r = mid - 1
        # if nums[l] == target: return l
        return -1

相关推荐

  1. LeetCode 33 搜索旋转排序数组

    2024-04-06 18:32:04       67 阅读
  2. LeetCode 33. 搜索旋转排序数组

    2024-04-06 18:32:04       55 阅读
  3. Leetcode33- 搜索旋转排序数组

    2024-04-06 18:32:04       34 阅读
  4. leetCode33. 搜索旋转排序数组

    2024-04-06 18:32:04       37 阅读
  5. 33.搜索旋转排序数组

    2024-04-06 18:32:04       66 阅读
  6. LeetCode--代码详解 33.搜索旋转排序数组

    2024-04-06 18:32:04       48 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 18:32:04       91 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 18:32:04       97 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 18:32:04       78 阅读
  4. Python语言-面向对象

    2024-04-06 18:32:04       88 阅读

热门阅读

  1. 常见面试题--动态规划介绍(附C++源码实现)

    2024-04-06 18:32:04       44 阅读
  2. c++ 动态分配内存

    2024-04-06 18:32:04       37 阅读
  3. 深入理解springboot

    2024-04-06 18:32:04       121 阅读
  4. 【Datax分库分表导数解决方法】MySQL_to_Hive

    2024-04-06 18:32:04       191 阅读
  5. 蓝桥杯嵌入式总结

    2024-04-06 18:32:04       27 阅读