剑指Offer06 Java 旋转数组找最小值
package offer6;
/**
* 把一个数组最开始的若干个元素搬到数组的末尾,
* 我们称之为数组的旋转。
* 输入一个非递减排序的数组的一个旋转,
* 输出旋转数组的最小元素。
* 例如:数组{3,4,5,1,2}是{1,2,3,4,5}的一个旋转
* 该数组的最小值为1
* 求出旋转数组中的最小值
* <p>
* 思路:
* <p>
* 采用二分法的查找思想
* <p>
* 先确定该数组的一个mid中间索引值
* <p>
* 如果该中间值的右边比该中间值要小,则继续在右边二分查找
* 否则在该中间值的左边进行二分查找
* 当该中间值的左右两边都要比中间值大的时候,
* 我们就找到了该旋转数组的最小值
*
* @author RhymeChiang
* @date 2018/01/15
**/
public class Offer6 {
/**
* 寻找旋转数组中的最小值
*
* @param array
* @return
*/
public static int findSmallest(int[] array) {
// 数组为空
if (array.length < 1) {
return -1;
}
// 数组长度为1
if (array.length == 1) {
return array[0];
}
// 数组中只有两个元素
if (array.length == 2) {
return array[1];
}
int left = 0;
int right = array.length - 1;
int mid;
int midValue;
int midLeftValue;
int midRightValue;
while (left <= right) {
mid = (left + right) / 2;
midValue = array[mid];
midLeftValue = array[mid - 1];
midRightValue = array[mid + 1];
// 找到最小值
if (midValue <= midLeftValue && midValue <= midRightValue) {
return midValue;
}
// 继续在左边二分查找
if (midValue > midLeftValue) {
right = mid;
} else {
left = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
int []array = new int[]{6,7,8,1,2,3,4,5};
System.out.println(findSmallest(array));
}
}
测试结果: