旋转数组的最小数字

题目描述

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

问题分析

对于旋转数组来说,我们可以利用二分法查找其最小值。

我们现在有两个选择,数组中间位的数与最低位比较或者与最高位比较。

与最低位比较:若数组中间位的数小于最低位的数,那么最小值一定在最低位与中间位之间;若数组中间位的数大于最低位的数,那么有两种情况,{4, 5, 6, 7, 1, 2, 3}和{1, 2, 3}。子数组前半段状况是不可预知的,可能是已经被我们筛出去了旋转过来的元素,所以选择数组中间位的元素与最高位的元素进行比较。

代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int minNumberInRotateArray(int[] array) {
if (array.length == 0) {
return 0;
}

int low = 0;
int high = array.length - 1;
int medium = (low + high) / 2;

while (low < high) {
if (array[medium] < array[high]) {
high = medium;
} else {
low = medium + 1;
}

medium = (low + high) / 2;
}

return array[low];
}
-------------本文结束感谢您的阅读-------------

本文标题:旋转数组的最小数字

文章作者:huihui

发布时间:2018年10月21日 - 00:10

最后更新:2019年02月14日 - 19:02

原始链接:http://101.200.47.120:8011/2018/10/21/旋转数组的最小数字/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。