-
链接 : 原题
-
题意 : 给定一个山脉数组,即凸函数,寻找一个数值等于target的index。
-
思路 :
因为凸函数峰值的左右都是一个单调函数,所以只要找到峰值,再对两边分别进行二分查找就可。
凹凸函数找峰值,本来我是想用三分查找的,但是三分查找能确定峰值是double类型,即连续函数才适用的。整数点构成的凹凸函数,三分查找只能缩减一个区间。例如此题 :牛客算法周周练4 E题装备合成。
所以本次学到了一种 二分凹凸函数找极值 的方法。对于一个区间 [l , r] ,mid1 = (l + r)/2,我们再寻找一个mid2 = mid1 + 1。如果mid1 的值 > mid2 的值,那么 [mid2 , r] 是一个递减的区间;否则 [l, mid1]是一个递增的区间。
这样最后就能确定一个峰值peak。
最后再对左边递增区间二分查找,如果没找到再到右边二分查找。 -
代码:
/**
* // This is the MountainArray's API interface.
* // You should not implement it, or speculate about its implementation
* class MountainArray {
* public:
* int get(int index);
* int length();
* };
*/
class Solution {
public:
int findInMountainArray(int target, MountainArray &mountainArr) {
int l = 0, r = mountainArr