剑指offer JZ6 旋转数组的最小数字
发布日期:2021-05-07 10:44:56 浏览次数:24 分类:精选文章

本文共 1060 字,大约阅读时间需要 3 分钟。

JZ6 旋转数组最小数问题

题目链接

该题目来源于著名的算法面试题,题目描述如下:给定一个旋转排序数组,找出其中最小的数。数组的特点是其是排序数组的一次旋转,例如:[456, 123],其中123是旋转后的有序部分。

本题思路

本题的解决思路利用了二分查找算法,通过对数组进行高效的查找,找到旋转后的最小数。以下是具体的实现步骤:

基本思路

  • 特殊情况处理:如果数组为空,直接返回0。
  • 初始化指针:设置lohi两个指针,分别指向数组的开头和末尾。
  • 二分查找:通过不断调整lohi的位置,找到旋转数组的最小数。
  • 终止条件:当lohi指针相邻时,返回较大的那个数。
  • 二分查找逻辑

    在二分查找过程中,主要比较两部分的值:

    • 如果当前mid点的值小于等于hi点的值,说明最小数在lomid区间。
    • 否则,最小数在midhi区间。
    1. 返回结果:当lohi指针相邻时,返回较大的那个数。
    2. 代码实现

      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;    }}

      代码解释

    3. 特殊情况处理:首先检查数组是否为空,若为空返回0。
    4. 初始化指针lo设为0,hi设为数组末尾索引。
    5. 二分查找循环
      • 计算mid点。
      • 如果hilo相邻,直接返回hi点的值。
      • 比较mid点与hi点的值,决定调整hilo的位置。
    6. 返回结果:循环结束后返回最小数。
    7. 该算法的时间复杂度为O(n),能够在O(log n)时间内完成查找任务,效率非常高。

    上一篇:二叉树 简单实现 问题解决
    下一篇:整理 一些名词

    发表评论

    最新留言

    能坚持,总会有不一样的收获!
    [***.219.124.196]2025年04月02日 18时33分22秒