【每日一题】局部最小值问题

局部最小值问题

题目

给定一个无序数组,相邻的数并不相等,那么就会产生很多个局部最小的值,找到任意一个局部最小的值的位置返回

局部最小:一个数满足小于相邻的左边的数和小于相邻的右边的数

例如:arr=[5,2,3,1,4,6,10,9,20], 返回:2或1或9任意一个都可以

解析

  • 关键字:无序数组、相邻的数不相等、找到任意一个局部最小

  • 使用的算法:因为给定的是无序数组,所以看起来不符合前面说到的可以直接使用二分查找算法,但是根据题意,可以将计算的逻辑分为两种情况:

    • 第一种:直接判断第一个数或最后一个数是否小于相邻的数,如果小于,那么直接返回

    • 第二种:如果第一个数和最后一个数都不小于相邻的数,那么数组的趋势如下所示:

      在这里插入图片描述

      开头和结尾的趋势是下降和上升,那么我们是否在中间的位置找到一个上升或下降的位置,就找到了局部最小。如何快速的找到对应的位置呢?

    • 还是可以使用二分查找法,不过这里只是用二分查找的框架流程,具体的判断条件是单独实现

  • 算法逻辑:

    1. 判断第一个数和最后一个数是否为局部最小的数

    2. 如果不是,那么查看中间的数mid和相邻的数进行比较

      • 如果大于mid-1,那么继续向左边的子数组递归寻找

        因为右边可能是连续上升的一连串数,而左边的子数组是有下降和上升两种不同的趋势,所以必定有局部最小值
        在这里插入图片描述

      • 如果大于mid+1,那么继续向右边的子数组递归寻找

        因为左边有两个下降,所以可能左边都是连续下降的一连串数,而右边的子数组是有下降以及后面的上升的两种不同的趋势,所以必定是有局部最小值
        在这里插入图片描述

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值