转自:https://leetcode-cn.com/problems/xuan-zhuan-shu-zu-de-zui-xiao-shu-zi-lcof/solution/javaer-fen-cha-zhao-fa-jian-zhi-offerer-qebj4/ 仅做个人备份,浏览请看原文
具体步骤:
定义首尾指针 head、tail 分别指向旋转数组后的第一个元素和最后一个元素,取中点mid进行比较:
- 如果numbers[mid] > numbers[tail] : 说明中间位置的元素是位于第一个有序部分的。那么最小值一定是位于[m+1, tail]区间内的,head = mid + 1。例如:[3,4,5,1,2]。
- 如果numbers[mid] < numbers[tail] : 说明中间位置的元素是位于第二个有序部分的。那么最小值一定是位于[head, mid]区间内的,tail = mid。例如:[2,3,2,2,3]。
- 如果numbers[mid] = numbers[tail] : 这种情况下是无法判断中间位置的元素位于哪个部分的,所以tail --。例如:[2,2,2,1,2] 。
返回值:当head = tail时,查找结束,返回number[head]
class Solution {
public int minArray(int[] numbers) {
// 首尾指针
int head = 0;
int tail = numbers.length - 1;
while(head < tail){
int mid = (head + tail) / 2;
if(numbers[mid] > numbers[tail]){
head = mid + 1;
}else if(numbers[mid] < numbers[tail]){
tail = mid;
}else{
tail --;
}
}
return numbers[head];
}
}