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

LeetCode 153. 寻找旋转排序数组中的最小值(C语言题解)

一、题目描述

已知一个长度为n的数组,原本按升序排列,但在某个未知位置进行了旋转,例如:

原数组: [0,1,2,4,5,6,7] 旋转后可能变为: [4,5,6,7,0,1,2]

现在给定旋转后的数组nums,要求找出数组中的最小值

要求:

  • 时间复杂度必须为O(log n)


二、解题思路(二分查找)

由于数组原本是升序排列的,只是被旋转了一次,因此数组可以看作两段有序区间

[较大的一段] + [较小的一段]

例如:

[4,5,6,7 | 0,1,2]

最小值就是第二段的第一个元素

因此可以使用二分查找来定位这个位置。

核心判断

设:

left = 0 right = n - 1 mid = (left + right) / 2

比较nums[mid]nums[right]

情况1:nums[mid] > nums[right]

说明mid左半部分递增区间

[4,5,6,7 | 0,1,2] ↑ mid

最小值一定在右边

left = mid + 1

情况2:nums[mid] < nums[right]

说明mid右半部分递增区间

[4,5,6,7 | 0,1,2] ↑ mid

最小值在mid 或左侧

right = mid

left == right时,循环结束,此时位置就是最小值。


三、C语言代码实现

int findMin(int* nums, int numsSize) { int left = 0; int right = numsSize - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[right]) { // 最小值在右半部分 left = mid + 1; } else { // 最小值在左半部分(包含mid) right = mid; } } return nums[left]; }

四、示例分析

示例

输入: nums = [4,5,6,7,0,1,2] 输出: 0

执行过程:

left=0 right=6 mid=3 nums[mid]=7 > nums[right]=2 → left=4 left=4 right=6 mid=5 nums[mid]=1 < nums[right]=2 → right=5 left=4 right=5 mid=4 nums[mid]=0 < nums[right]=1 → right=4 left=4 right=4 结束

最小值为:

nums[4] = 0

五、复杂度分析

类型复杂度
时间复杂度O(log n)
空间复杂度O(1)

二分查找每次可以排除一半区间,因此时间复杂度为log n


六、总结

本题的关键在于理解:

  • 旋转数组 = 两段递增数组

  • 利用nums[mid]nums[right]判断最小值所在区间

  • 通过二分查找不断缩小范围

这是旋转数组系列问题的基础题,和以下题目属于同一类型:

  • 33. 搜索旋转排序数组

  • 81. 搜索旋转排序数组 II

  • 154. 寻找旋转排序数组中的最小值 II

掌握这种二分查找的区间判断方法,可以解决大部分旋转数组问题。

http://www.cnnetsun.cn/news/1399031.html

相关文章:

  • 从问题出发设计产品:Problem First 方法
  • 用户意图理解在AI原生应用中的最新研究进展
  • C语言modf和fmod函数实战:如何精确拆分和计算浮点数余数?
  • Qwen3-ASR-0.6B高并发实践:128并发下2000倍吞吐量实现
  • 告别白屏焦虑:用ECharts的showLoading/hideLoading给你的异步图表加个‘缓冲条’
  • Pixel Dimension Fissioner代码实例:调用API批量处理Excel文案表的Python脚本
  • PaddleOCR打包踩坑实录:从spec配置到模型路径,手把手教你避开PyInstaller那些‘坑’
  • 告别OpenAI API费用!手把手教你用Ollama+Python搭建本地免费的AI助手(附完整代码)
  • 小白也能搞定!通义千问1.8B轻量化部署实战:从安装到对话全流程
  • gazebo 中通过sac 训练机械臂进行轨迹规划
  • 西门子200smart恒压供水(3托3)项目分享
  • Qwen3.5-9B入门必看:9B参数开源大模型Gradio Web UI实操指南
  • Phi-3-Mini-128K赋能微信小程序:开发智能学习辅导应用实战
  • 造相-Z-Image-Turbo LoRA 开发环境搭建:VMware虚拟机中配置GPU直通
  • 3步告别乱码困扰:ConvertToUTF8让Sublime Text完美支持中文编码
  • 学习网络安全渗透测试常用工具大全,渗透测试20款工具零基础入门实战指南,渗透测试入门必备教程!
  • SPI协议详解与W25Q32闪存驱动实战
  • 终极音频设备管理工具:如何一键切换Windows音频输入输出设备
  • 解放你的B站缓存:m4s-converter让视频自由播放的终极指南
  • HY-MT1.5-7B翻译模型实战部署:基于vLLM的高性能服务搭建
  • YOLO X Layout模型可视化:理解文档分析过程
  • 实战指南:在Dify中构建安全的MySQL数据库智能体
  • 基于STM32和LWIP协议栈的MQTT客户端开发与EMQ_X_CLOUD平台对接实战
  • SOONet模型在ComfyUI中的工作流搭建:可视化视频分析管道
  • Face Analysis WebUI企业应用:HR部门批量分析候选人照片实现性别/年龄维度初筛
  • 技术解析:brSmoothWeights在Maya角色绑定中的权重平滑与转移技术方案
  • iOS审核避坑指南:如何巧妙应对Guideline 5.1.1隐私数据收集问题(附真实案例)
  • 别再硬编码了!Tkinter的StringVar/IntVar动态绑定技巧:5分钟实现时钟计数器
  • 为什么Transformer模型都爱用AdamW?从BERT到ViT的优化器选择实战解析
  • Floyd-Warshall算法在社交网络分析中的5个实际应用案例