-
题目确实说的不清楚,应该是非递减有序数列,否则只能暴力解法了
-
思路:
- 特殊情况:当数组长度小于等于2时,直接返回最后一个数
- 本题相当于是一个分段函数,每段都是非单调递增,目标点位于分段处,
- 利用二分算法,本题的判断条件可以是:
- 当array[mid]比两边的数都小,直接返回;
- 当array[mid]<=array[mid+1],且<=array[length-1],说明位于第二段内,目标点在左侧,right=mid-1
- 然后就是第三种情况位于第一段内,目标点在右侧,left=mid+1
- 判断条件中会引入mid-1和mid+1,就需要分出当 mid=0、mid=array.length-1 两种情况单独判断
-
代码感觉不是很精简,分情况太多
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
//特殊情况,直接返回
if(array.length<=2)return array[array.length-1];
int left=0;
int right=array.length-1;
int mid=0;
//进入循环,条件与二分算法相同
while(right>=left){
mid=left+(right-left)/2;
//当mid=0时
if(mid==0&&array[1]<array[0]){
return array[1];
}else if(mid==0&&array[0]<=array[1]){
return array[0];
}
//当mid=array.length-1时
if(mid==array.length-1)return array[mid];
//分三种情况分别判断
if(array[mid]<array[mid-1]&&array[mid]<=array[mid+1]){
return array[mid];
}else if(array[mid]<=array[mid+1]&&array[mid]<=array[array.length-1]){
right=mid-1;
}else{
left=mid+1;
}
}
return array[mid];
}
}