题目
代码
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0){
return 0;
}
int first = 0;
int last = array.length-1;
while(first < last){
if(array[first] < array[last]){
return array[first];
}
int mid = (first+last)/2;
if(array[mid] > array[last]){
first = mid+1;
}
else if(array[mid] < array[last]){
last = mid;
}
else{
last-=1;
}
}
return array[first];
}
}
思路
根据旋转数组的题意,用二分法来解决问题。首先设置数组的最右端为target,用arr[mid]和target进行比较,然后确定最终答案位于哪一侧,再进行下一轮比较。
比较时有3种情况:
1.arr[mid] > target,可以确定结果位于[mid+1,last]之间,first = mid+1;
2.arr[mid] < target, 确定结果位于[first,mid]之间,所以last = mid;
3.arr[mid] == target,这种情况答案在2边的可能性都有,所以就直接把last-1,再进行下一轮比较。
总结
这个题主要考二分查找法的理解。其中如何判断中轴值与端点值的3种情况需要仔细研究。