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

LeetCode-热题100:153. 寻找旋转排序数组中的最小值

题目描述

已知一个长度为 n 的数组,预先按照升序排列,经由 1n旋转 后,得到输入数组。例如,原数组 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 ,它原来是一个升序排列的数组,并按上述情形进行了多次旋转。请你找出并返回数组中的 最小元素

你必须设计一个时间复杂度为 O(log n) 的算法解决此问题。

示例 1:

输入: nums = [3,4,5,1,2]
输出: 1
解释: 原数组为 [1,2,3,4,5] ,旋转 3 次得到输入数组。

示例 2:

输入: nums = [4,5,6,7,0,1,2]
输出: 0
解释: 原数组为 [0,1,2,4,5,6,7] ,旋转 3 次得到输入数组。

示例 3:

输入: nums = [11,13,15,17]
输出: 11
解释: 原数组为 [11,13,15,17] ,旋转 4 次得到输入数组。

提示:

  • n == nums.length
  • 1 <= n <= 5000
  • -5000 <= nums[i] <= 5000
  • `nums 中的所有整数 互不相同
  • nums 原来是一个升序排序的数组,并进行了 1n 次旋转

代码及注释

func findMin(nums []int) int {left, right := 0, len(nums) - 1 // 循环直到左指针超过右指针for left <= right {// 如果右指针对应的值大于或等于左指针对应的值,说明数组是升序的,直接返回左指针对应的值if nums[right] >= nums[left] {return nums[left]}// 如果只剩下两个元素,返回右指针对应的值,因为数组升序已经判断过了,因此这里直接可以知道nums[right] < nums[left]if right - left == 1 {return nums[right]}mid := (left + right) / 2// 如果中间值是最小值,返回中间值if nums[mid] <= nums[mid - 1] && nums[mid] <= nums[mid + 1] {return nums[mid]}// 如果中间值大于等于左指针对应的值,说明最小值在右半部分,更新左指针if nums[mid] >= nums[left] {left = mid + 1} else { // 否则,最小值在左半部分,更新右指针right = mid - 1}}return 0
}

代码解释

  1. 初始化左右指针:

    • left 指向数组的第一个元素。
    • right 指向数组的最后一个元素。
  2. 循环查找最小值:

    • 如果 nums[right] >= nums[left],说明数组是升序的,直接返回 nums[left]
    • 如果只剩下两个元素 (right - left == 1),因为数组升序已经判断过了,因此这里直接可以知道nums[right] < nums[left],返回 nums[right]
    • 计算中间值 mid
    • 如果 nums[mid] <= nums[mid - 1] && nums[mid] <= nums[mid + 1],说明 mid 是最小值,返回 nums[mid]
    • 如果 nums[mid] >= nums[left],说明最小值在 mid 右侧,更新 left = mid + 1
    • 否则,最小值在 mid 左侧,更新 right = mid - 1

这段代码的时间复杂度是 O(log n),其中 n 是数组 nums 的长度。

http://www.lryc.cn/news/327739.html

相关文章:

  • 游戏客户客户端面经
  • 网站业务对接DDoS高防
  • Python-VBA编程500例-024(入门级)
  • 蓝桥杯 - 小明的背包1(01背包)
  • 学习java第二十六天
  • Go第三方框架--gin框架(二)
  • 五分钟搞懂UDS刷写34/36/37服务(内含S19文件解读)
  • 知识图谱智能问答系统技术实现
  • 【unity】如何汉化unity编译器
  • 为什么Python不适合写游戏?
  • 查询优化-提升子查询-UNION类型
  • 【数据结构 | 图论】如何用链式前向星存图(保姆级教程,详细图解+完整代码)
  • 气象预测新篇章:Python人工智能的变革力量
  • 基于微信小程序的民宿短租系统设计与实现(论文+源码)_kaic
  • vue3开发前端表单缓存自定义指令,移动端h5必备插件
  • 骗子查询系统源码
  • 目标检测+车道线识别+追踪
  • 非wpf应用程序项目【类库、用户控件库】中使用HandyControl
  • 【python】flask执行上下文context,请求上下文和应用上下文原理解析
  • DDos系列攻击原理与防御原理
  • Python拆分PDF、Python合并PDF
  • SqlServer(4)经典总结大全-技巧总结-数据开发-基本函数-常识整理-经典面试题
  • ArcGIS矢量裁剪矢量
  • pygame用chatgpt绘制3d沿x轴旋转的
  • golang大小写规则的影响
  • 基于Java在线考试系统系统设计与实现(源码+部署文档)
  • 如何应对复杂软件工程的开发流程?
  • JAVA的NIO和BIO底层原理分析
  • Python学习从0到1 day18 Python可视化基础综合案例 1.折线图
  • HTML网站的概念