二分寻找最小数

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

相关推荐

渐好:软光栅真的写明白了吗,既然是软渲那技术栈不应该使用OpenGL,光追和bvh既不算什么高级渲染技术更不应该属于软渲的内容,git那个项目没啥用,建议把前两个项目重新组织一下语言,比如软渲染那个项目 冯着色和msaa、贴图这几项分开写,写的到位点,如果你还学过光追那就单独写出来,如果没把握考官问你答不上来就别写给自己找麻烦,在技术栈那一栏简单提一下自己学过就行,这样杂的放在一起不太严谨,个人愚见.
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客企业服务