力扣33.搜索旋转排序数组、153.寻找排序数组中的最小值

33.搜索旋转排序数组

思路:

关键在于判断target、nums-1和numsmid之间的位置关系:1. target、numsmid在同一段,按照之前同样的方法进行左右端点的移动;2. target在第一段numsmid在第二段,即target > nums-1 >= numsmid(可自行举例验证),需要移动right;3. target在第二段numsmid在第一段,即numsmid > nums-1 >= target,需要移动left。

代码:

python 复制代码
class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            if target > nums[-1] >= nums[mid]:  # target 在第一段,x 在第二段
                right = mid - 1
            elif nums[mid] > nums[-1] >= target:  # x 在第一段,target 在第二段
                left = mid + 1
            elif nums[mid] >= target:  # 否则,x 和 target 在同一段,与之前方法类似
                right = mid - 1
            else:
                left = mid + 1

        return left if nums[left] == target else -1

复杂度分析:

  • 时间复杂度:O(logn),其中 n 为 nums 的长度。
  • 空间复杂度:O(1)。

153.寻找排序数组中的最小值

思路:

把 x 与最后一个数 nums−1 比大小:

  1. 如果 x>numsn−1,那么可以推出以下结论:

nums 一定被分成左右两个递增段;第一段的所有元素均大于第二段的所有元素;x 在第一段,最小值在第二段。所以x 一定在最小值的左边

  1. 如果 x≤numsn−1,那么 x 一定在第二段。(或者 nums 就是递增数组,此时只有一段。)x 要么是最小值,要么在最小值右边。

参考:

https://leetcode.cn/problems/find-minimum-in-rotated-sorted-array/solutions/1987499/by-endlesscheng-owgd

代码:

python 复制代码
class Solution:
    def findMin(self, nums: List[int]) -> int:
        left, right = 0, len(nums) - 1
        while left <= right:
            mid = (left + right) // 2
            if nums[mid] <= nums[-1]:
                right = mid - 1  # 此时nums[mid]要么是最小值,要么在最小值右边
            else:
                left = mid + 1

        return nums[left]
相关推荐
倒头就睡的小比特1 天前
算法竞赛C++常用的STL
c++·算法
默_笙1 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!1 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003961 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫1 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技1 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读1 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
猎头南楼1 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
只睡四小时1 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
旖旎夜光1 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控