
剑指offer JZ6 旋转数组的最小数字
特殊情况处理:如果数组为空,直接返回0。 初始化指针:设置 二分查找:通过不断调整 终止条件:当
发布日期:2021-05-07 10:44:56
浏览次数:24
分类:精选文章
本文共 1060 字,大约阅读时间需要 3 分钟。
JZ6 旋转数组最小数问题
题目链接
该题目来源于著名的算法面试题,题目描述如下:给定一个旋转排序数组,找出其中最小的数。数组的特点是其是排序数组的一次旋转,例如:[456, 123]
,其中123是旋转后的有序部分。
本题思路
本题的解决思路利用了二分查找算法,通过对数组进行高效的查找,找到旋转后的最小数。以下是具体的实现步骤:
基本思路
lo
和hi
两个指针,分别指向数组的开头和末尾。lo
和hi
的位置,找到旋转数组的最小数。lo
和hi
指针相邻时,返回较大的那个数。二分查找逻辑
在二分查找过程中,主要比较两部分的值:
- 如果当前
mid
点的值小于等于hi
点的值,说明最小数在lo
到mid
区间。 - 否则,最小数在
mid
到hi
区间。
- 返回结果:当
lo
和hi
指针相邻时,返回较大的那个数。 - 特殊情况处理:首先检查数组是否为空,若为空返回0。
- 初始化指针:
lo
设为0,hi
设为数组末尾索引。 - 二分查找循环:
- 计算
mid
点。 - 如果
hi
和lo
相邻,直接返回hi
点的值。 - 比较
mid
点与hi
点的值,决定调整hi
或lo
的位置。
- 计算
- 返回结果:循环结束后返回最小数。
代码实现
public class Solution { public int minNumberInRotateArray(int[] array) { if (array.length == 0) { return 0; } int lo = 0; int hi = array.length - 1; while (lo <= hi) { int mid = (lo + hi) / 2; if (hi - lo == 1) { return array[hi]; } if (array[mid] <= array[hi]) { hi = mid; } else { lo = mid; } } return 0; }}
代码解释
该算法的时间复杂度为O(n),能够在O(log n)时间内完成查找任务,效率非常高。
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月02日 18时33分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
【C/C++基础进阶系列】C/C++ 对象模型 -- 类基础知识总结(三)
2019-03-04
【C/C++基础进阶系列】C/C++ 对象模型 -- 对象语义
2019-03-04
基于FPGA的HDMI信号采样原理
2019-03-04
Spring 与使用STOMP消息
2019-03-04
AngularJS ng-class、ng-style
2019-03-04
Linux 查看系统语言
2019-03-04
十 一、C语言创建桌面程序:单选按钮、复选框和分组框控件
2019-03-04
Java基本查找算法--顺序查找
2019-03-04
Java格式化字符串
2019-03-04
Java代理
2019-03-04
Java Swing JList:列表框组件
2019-03-04
AngularJS $q
2019-03-04
jQuery中的动画
2019-03-04
Linux host命令
2019-03-04
MySql 内容聚合
2019-03-04
MongoDB 查询分析
2019-03-04
C++ 环境设置
2019-03-04
C++ 模板(泛型)编程
2019-03-04
编写Makefile.am
2019-03-04