当前位置: 首页 > news >正文

python-leetcode 66.寻找旋转排序数组中的最小值

题目:

已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组,例如,原数组 nums = [0,1,2,4,5,6,7] 在变化后可能得到:

  • 若旋转 4 次,则可以得到 [4,5,6,7,0,1,2]
  • 若旋转 7 次,则可以得到 [0,1,2,4,5,6,7]

注意,数组 [a[0], a[1], a[2], ..., a[n-1]] 旋转一次 的结果为数组 [a[n-1], a[0], a[1], a[2], ..., a[n-2]] 

给定一个元素互不相同的数组nums,它原来是一个升序排列的数组,并按上述情形进行了多次旋转,找出并返回数组中的最小元素。

 


题目:二分查找

一个不包含重复元素的升序数组在经过旋转之后,可以得到下面可视化的折线图:

 其中横轴表示数组元素的下标,纵轴表示数组元素的值。图中标出了最小值的位置,是我们需要查找的目标。

考虑数组中的最后一个元素x::在最小值右侧的元素(不包括最后一个元素本身),它们的值一定都严格小于 x;而在最小值左侧的元素,它们的值一定都严格大于 x。因此可以通过二分查找的方法找出最小值。

在二分查找的每一步中,左边界为 low,右边界为 high,区间的中点为 pivot,最小值就在该区间内。将中轴元素 nums[pivot] 与右边界元素 nums[high] 进行比较,

可能会有以下的三种情况:

第一种情况是 nums[pivot]<nums[high]。如下图所示,这说明 nums[pivot] 是最小值右侧的元素,因此我们可以忽略二分查找区间的右半部分。

第二种情况是 nums[pivot]>nums[high]。如下图所示,这说明 nums[pivot] 是最小值左侧的元素,因此我们可以忽略二分查找区间的左半部分。

 

由于数组不包含重复元素,并且只要当前的区间长度不为 1,pivot 就不会与 high 重合;而如果当前的区间长度为 1,这说明我们已经可以结束二分查找了。因此不会存在 nums[pivot]=nums[high] 的情况。

当二分查找结束时,就得到了最小值所在的位置。

class Solution(object):
    def findMin(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        low,high=0,len(nums)-1 #初始化两个指针low和high,分别指向数组的开始(0)和结束位置
        while low<high:#当low指针小于high指针时继续循环
            mid=low+(high-low)//2  #计算中间位置
            if nums[mid]<nums[high]: #说明最小值在左半部分
                high=mid  #将右指针移动到中间位置
            else: #说明最小值在右半部分
                low=mid+1
        return nums[low]  #low == high,指向的就是最小值的位置

时间复杂度为: O(logn),其中 n 是数组 nums 的长度

空间复杂度:O(1)

源自力扣官方题解
 

 

相关文章:

  • 快速记忆法,提高知识点背诵效率
  • MySQL学习笔记十
  • 【LangChain框架组成】 LangChain 技术栈的模块化架构解析
  • 安徽合肥天猫代入驻精细化运营实战
  • 4.8刷题记录(双指针)
  • 15-17手写持久层框架优化
  • 【Linux高级IO(三)】Reactor
  • Java基础编程练习第38题-除法器
  • C++隐式转换的机制、风险与消除方法
  • LLMs之Llama:Llama 4(Llama 4 Maverick Scout)的简介、安装和使用方法、案例应用之详细攻略
  • 基于人工智能的高中教育评价体系重构研究
  • MATLAB2024a超详细图文安装教程(2025最新版保姆级教程)附安装钥
  • 模板方法模式详解
  • Django学习记录-1
  • 利用 schedule 模块在每日上午每 3 秒执行任务
  • 【接口自动化_数据格式与类型】
  • 【C】结构体初始化方法
  • Linux网络多进程并发服务器和多线程并发服务器
  • 全面解析https代理服务器URL
  • Linux | I.MX6ULL外设功能验证(第10天)
  • 网站应用开发/网站维护合同
  • 建设银行可以查房贷的网站/外贸展示型网站建设公司
  • 湖南二级建造师在哪个网站做变更/长春头条新闻今天
  • centos卸载wordpress/兰州seo公司
  • 花生壳怎么发布自己做的网站/贷款客户大数据精准获客
  • 广州网站营销优化开发/百度权重等级