旋转数组的最小数字

题目:

把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。  

示例 1:

输入:[3,4,5,1,2]
输出:1
示例 2:

输入:[2,2,2,0,1]
输出:0

解答:

技巧性比较强,很容能够得到复杂度O(n)的方法,通过比较前后两个元素,如果前一个大于后一个,那么后一个元素即为最小值;最优的方法可以看如下规律:比如数组1234567,可以有以下:

7123456、6712345、5671234、4567123、3456712、2345671;可以看到中间的那个值能将要查的范围缩短为一半,看前面还是右面能保序,注意中间的值可能为所求最小值;终止条件为只剩下两个元素时,位置较高的那个元素即为所求,整个过程相当于二分查找复杂度O(log2n)。这道题如果不把这些情况列出来分析下,不容易想到二分可以解决。

 1 public class Solution {
 2     public int minNumberInRotateArray(int [] array) {
 3         if(array.length == 0){
 4             return 0;
 5         }
 6         int low = 0, high = array.length - 1;
 7         while(low < high){
 8             if(high - low == 1){
 9                 break;
10             }
11             int mid = (low + high) / 2;
12             if(array[mid] > array[high]){
13                 low = mid;
14             }else{
15                 high = mid;    
16             }
17         }
18         return array[high];
19     }
20 }

 

posted @ 2020-04-17 21:55  heaven夏  阅读(255)  评论(0编辑  收藏  举报