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

题目描述

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。
NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。
 
解法1:
思路:直接遍历(不思考题目意思的解法)
 1 public int minNumberInRotateArray(int [] array) {
 2         if(array.length==0)
 3             return 0;
 4         int Min_array=Integer.MAX_VALUE;
 5         for(int i=0;i<array.length;i++) {
 6             if(array[i]<Min_array)
 7                 Min_array=array[i];
 8         }
 9         return Min_array;
10 }

解法2:

思路:由于旋转数组中的数字大小顺序是有规律可循的,观察一下即可得知:可以将旋转数组看成两个有序递增数组,即可以用二分法来解决。

 1 public int minNumberInRotateArray(int [] array) {
 2         
 3         if(array.length==0)
 4             return 0;
 5         int low=0;
 6         int high=array.length-1;
 7         while(low<high) {
 8             int mid=low+(high-low)/2;
 9             if(array[mid]>array[high]) {
10                 low=mid+1;
11             }else if(array[mid]==array[high]) {
12                 high-=1;
13             }else {
14                 high=mid;
15             }
16         }
17         return array[low];
18     }
原文地址:https://www.cnblogs.com/jacob-wuhan/p/12955550.html