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