局部最小值问题
题目
给定一个无序数组,相邻的数并不相等,那么就会产生很多个局部最小的值,找到任意一个局部最小的值的位置返回
局部最小:一个数满足小于相邻的左边的数和小于相邻的右边的数
例如:arr=[5,2,3,1,4,6,10,9,20], 返回:2或1或9任意一个都可以
解析
-
关键字:无序数组、相邻的数不相等、找到任意一个局部最小
-
使用的算法:因为给定的是无序数组,所以看起来不符合前面说到的可以直接使用二分查找算法,但是根据题意,可以将计算的逻辑分为两种情况:
-
第一种:直接判断第一个数或最后一个数是否小于相邻的数,如果小于,那么直接返回
-
第二种:如果第一个数和最后一个数都不小于相邻的数,那么数组的趋势如下所示:
开头和结尾的趋势是下降和上升,那么我们是否在中间的位置找到一个上升或下降的位置,就找到了局部最小。如何快速的找到对应的位置呢?
-
还是可以使用二分查找法,不过这里只是用二分查找的框架流程,具体的判断条件是单独实现
-
-
算法逻辑:
-
判断第一个数和最后一个数是否为局部最小的数
-
如果不是,那么查看中间的数mid和相邻的数进行比较
-
如果大于mid-1,那么继续向左边的子数组递归寻找
因为右边可能是连续上升的一连串数,而左边的子数组是有下降和上升两种不同的趋势,所以必定有局部最小值
-
如果大于mid+1,那么继续向右边的子数组递归寻找
因为左边有两个下降,所以可能左边都是连续下降的一连串数,而右边的子数组是有下降以及后面的上升的两种不同的趋势,所以必定是有局部最小值
-
-