二分寻找最小数
题目:https://www.nowcoder.com/practice/9f3231a991af4f55b95579b44b7a01ba?tpId=295&tqId=23269&ru=/exam/oj&qru=/ta/format-top101/question-ranking&sourceUrl=%2Fexam%2Foj
题解写得很好,排序数组的查找问题首先想到二分,二分的消耗少性能快,时间复杂度也很低。
首先循环条件,l < r,也作为终止条件
然后mid找出来,接下来就是关键的对比,如果mid > r,那么说明是上坡又下坡的,最小的数肯定在谷底,所以l = mid + 1.
如果l > mid,说明左边是山峰,那么l和mid的中间肯定会有谷底,不断缩短范围即可。
当mid = r 时: 无法判断 mm 在哪个排序数组中,即无法判断旋转点 x 在 [i, m] 还是 [m + 1, j] 区间中。解决方案: 执行 r = r - 1 缩小判断范围
返回值: 当 l = r 时跳出二分循环,并返回 旋转点的值 array[r] 即可。
import java.util.*;
import java.util.ArrayList;
public class Solution {
public int minNumberInRotateArray(int [] array) {
if(array.length == 0) return 0;
int l = 0;
int r = array.length - 1;
while(l < r){
int mid = (l + r) / 2;
if(array[mid] > array[r]){
l = mid + 1;
}else if(array[mid] < array[l]){
r = mid;
}else r--;
}
return array[r];
}
}

查看10道真题和解析