二分寻找最小数
题目: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]; } }