剑指 Offer 11. 旋转数组的最小数字
题目链接
题目分析
这个题很明显的二分查找题了,二分查找是最简单的算法,但是也是最难弄明白的算法。
这个题主要的问题是存在了相等的元素,如果遇到了相等的元素我们需要把right指针左移一位,做一个偏移然后再次检查。
然后就是当mid < right的时候,因为mid有可能是最小值,所以我们right移动到mid处。
当mid > right的时候,说明mid不可能是最小值了,因为其右边有比他更小的,并且left是一定会大于right,所以我们直接抛弃mid的元素,left = mid + 1。
注意好边界问题就很容易写出代码了
代码实现
class Solution {
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length-1;
while(left < right){
int mid = left + ((right - left) >> 1);
if(numbers[mid] < numbers[right]){
right = mid;
}else if(numbers[mid] > numbers[right]){
left = mid + 1;
}else{
right--;
}
}
return numbers[right];
}
}