二分寻找最小数

题目: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];
    }
}
全部评论

相关推荐

01-30 22:03
门头沟学院 Java
用微笑面对困难:我滴妈,【俩月】【实习】【主管】仨debuff吃满了,独立设计开发的项目写了绝大占比的运营板块,你独立开发,那维护、问题复盘、日志更新、bug、策划书全是自己整的? 不建议写那么大,可以从小出发更容易
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务