局部最小值

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

求局部最小值。

题意解析:

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-28 22:32
门头沟学院 C++
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务