题目描述

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

关键点:

1、中间值和右边界值比较,因为右边是非递减的,可以确定左右边界移动的方向。

2、注意右边界移动时不能mid-1。

原因: mid =(2+3)/2 = 2
if(arr[2] < arr[3] )
r = mid -1; 即r = 2 - 1 = 1;
会把arr[2] 跳过,导致错误。

 

 

 

 

 1 import java.util.ArrayList;
 2 public class Solution {
 3     public int minNumberInRotateArray(int [] arr) {
 4         //空数组情况
 5         if(arr.length == 0){
 6             return 0;
 7         }
 8         int l = 0;
 9         int r = arr.length-1;
10         while(l<r){
11             int mid = (l+r)/2;
12             //与右边界比较,因为右边都是非递减的
13             if(arr[mid] > arr[r]){
14                 l = mid +1;
15             //不是 r=mid-1 
16             /*
17             原因: mid =(2+3)/2 = 2
18             if(arr[2] < arr[3] )
19             r = mid -1; 即r = 2 - 1 = 1;
20             会把arr[2] 跳过,导致错误。
21             */
22             }else if(arr[mid] < arr[r]){
23                 r = mid;
24             }else{
25                 //l++也行。因为arr[l]左边 <= arr[l],arr[r]右边>=arr[r]
26                 r--;
27             }
28         }
29         return arr[l];
30     }
31 }