局部最小值

前提:给一无序数组,相邻元素值不等;

求局部最小值。

题意解析:

1、局部最小值,非全局最小值。

2、可以借助二分法进行查找定位局部最小值。

场景考虑:

1)、一个元素比两边元素都小,即可认定位局部最小值。“执行比较逻辑”:

arr[mid]<arr[mid+1] && arr[mid]<arr[mid-1] 

可知条件为:

Mid-1>=L ,
mid+1<=R ,
mid=(L+R)/2

根据数学方式推导满足的场景为: 走这个“执行比较逻辑”的条件为:L<=R-2 【L初始值0 ,R初始值 len-1 ,即数组至少2个元素】

2)、边界值情况:数组为空,数组元素个数:1/2个 可以提前单独处理。

3)、对边界值,二分法的LR位置一直在动,要考虑多元素数组处理后,LR可能更新成边界位置,情况同元素1/2个处理一致。

具体实现:

/*
     * @Param arr :相邻元素不能相等,数组无序
     * @Return 返回局部最小值下标
     * */
    int testDepartMinValue(int[] arr) {
        if (null == arr || arr.length == 0) {
            return -1;
        }
        int N = arr.length;
        if (N == 1) {
            return 0;
        }
        //采用二分法的形式
        int L = 0;
        int R = N - 1;

        if (arr[L] < arr[L+1]) {
            return L;
        }
        if (arr[R] < arr[R - 1]) {
            return R;
        }
        while (L <= R - 2) {
            int mid = (L + R) / 2;
            if (arr[mid] < arr[mid - 1] && arr[mid] < arr[mid + 1]) {
                return mid;
            } else {
                if (arr[mid] > arr[mid - 1]) {
                    R = mid - 1;
                } else {
                    L = mid + 1;
                }
            }
        }
        //即便多个元素,不停被赋值的 L和 R 也有可能成为边界位置,这种情况要处理。
        return arr[L] > arr[R] ? R : L;
    }

#局部最小值#
全部评论

相关推荐

01-19 12:48
门头沟学院 C++
只想搞钱的鸽子很喜欢...:混账是很多的,还有那些在自己风华正茂的年纪说风凉话讥讽那些下岗前员工的。这些人都是现在职场环境这么烂的帮凶
点赞 评论 收藏
分享
2025-12-14 11:43
黑龙江大学 Java
用微笑面对困难:确实比较烂,可以这么修改:加上大学的qs排名,然后大学简介要写一些,然后硕士大学加大加粗,科研经历第一句话都写上在复旦大学时,主要负责xxxx,简历左上角把学校logo写上,建议用复旦大学的简历模板
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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