二分法查找过程:
- 找到中间的关键字
- 比较查找的关键字与中间关键字的大小关系
- 如果相等,那么就算是已找到
- 如果查找的关键字小于中间的关键字则在前半部分进行同样的存储
- 如果查找的关键字大于中间的关键字则在后半部分进行同样的存储
二分法查找要求:
- 顺序存储
- 元素有序
class Solution {
public int minArray(int[] numbers) {
int left = 0;
int right = numbers.length - 1;
if(right == 0){
return numbers[0];
}
while(left < right){
int mid = left + (right - left) / 2;//防止出现越界问题
if(numbers[mid] > numbers[right]){//说明旋转点在mid右边
left = mid + 1;
}else if(numbers[mid] < numbers[right]){//说明旋转点在mid左边
right = mid;
}else if(numbers[mid] == numbers[right]){
right--;//从最右边-1遍历
}
}
return numbers[left];
}
}
Tips:
为什么上述代码中是
int mid = left + (right - left) / 2;
而不是二分法中常见的int mid = (left + right) / 2;
如果是int mid = (left + right) / 2;
的话会在left和right两者较大时发生整型越界为什么上述代码中是
right = mid;
而不是二分法中常见的right = mid - 1;
如果是right = mid - 1;
的话可能会漏掉mid这个值,有可能mid就是旋转点,即题目中所要求返回的值此题还有一种解法就是暴力解法,即从下标为0的元素开始遍历,每次进行比较,如果当前元素比相邻的下一个元素大,则对应的下一个元素为最小元素,如果查到最后一个元素没有出现上述元素,则下标为0的元素为最小元素