旋转数组的最小数字-剑指Offer

Posted RosenDing

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了旋转数组的最小数字-剑指Offer相关的知识,希望对你有一定的参考价值。

旋转数组的最小数字

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

思路

  1. 使用二分查找,因为该旋转数组是两段排序好的数组,可根据中间值判断中间值属于哪个排列数组,逐渐缩小范围。
  2. 注意考虑特殊情况,数组可能出现多个元素相等

代码

public class Solution06 {
    public int minNumberInRotateArray(int [] array) {
        if (array.length == 0) {
            return -1;
        }
        int index1 = 0;
        int index2 = array.length -1;
        int mid = index1;
        while (array[index1] >= array[index2]) {
            if ((index2 - index1) == 1) {
                mid = index2;
                break;
            }
            mid = (index2 + index1) / 2;
            if (array[mid] >= array[index1]) {
                index1 = mid;
            } else if (array[mid] <= array[index2]) {
                index2 = mid;
            }
        }
        return array[mid];
    }

}

改进

考虑数组中出现多个相等的元素

package com.sword;
import java.util.ArrayList;
public class Solution06 {
    public int minNumberInRotateArray(int [] array) {
        if (array.length == 0) {
            return -1;
        }
        int index1 = 0;
        int index2 = array.length -1;
        int mid = index1;
        while (array[index1] >= array[index2]) {
            if ((index2 - index1) == 1) {
                mid = index2;
                break;
            }
            mid = (index2 + index1) / 2;
            if (array[index1] == array[mid] && array[index2] == array[mid]) {
                return minOrder(array, index1, index2);
            }
            if (array[mid] >= array[index1]) {
                index1 = mid;
            } else if (array[mid] <= array[index2]) {
                index2 = mid;
            }
        }
        return array[mid];
    }
    public int minOrder(int[] data, int start, int end) {
        int result = data[start];
        for (int i = start + 1; i <= end; i++) {
            if (result > data[i]) {
                result = data[i];
            }
        }
        return result;
    }

}

以上是关于旋转数组的最小数字-剑指Offer的主要内容,如果未能解决你的问题,请参考以下文章

剑指 Offer 11. 旋转数组的最小数字 的详细题解

Java 剑指offer(10) 旋转数组的最小数字

《剑指offer》— JavaScript旋转数组的最小数字

剑指offer旋转数组的最小数字

java刷题-剑指offer 11 旋转数组的最小数字

剑指offer——旋转数组的最小数字