目录
- 题目
- 解法
- lambda在这是怎么用的?
题目
(这是一个 交互式问题 )
你可以将一个数组 arr 称为 山脉数组 当且仅当:
arr.length >= 3
存在一些 0 < i < arr.length - 1 的 i 使得:
arr[0] < arr[1] < … < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > … > arr[arr.length - 1]
给定一个山脉数组 mountainArr ,返回 最小 的 index 使得 mountainArr.get(index) == target。如果不存在这样的 index,返回 -1 。
你无法直接访问山脉数组。你只能使用 MountainArray 接口来访问数组:
MountainArray.get(k) 返回数组中下标为 k 的元素(从 0 开始)。
MountainArray.length() 返回数组的长度。
调用 MountainArray.get 超过 100 次的提交会被判定为错误答案。此外,任何试图绕过在线评测的解决方案都将导致取消资格。
解法
class Solution {
int binary_search(MountainArray &mountain, int target, int l, int r, int key(int)) {
target = key(target);
while (l <= r) {
int mid = (l + r) / 2;
int cur = key(mountain.get(mid));
if (cur == target) {
return mid;
} else if (cur < target) {
l = mid + 1;
} else {
r = mid - 1;
}
}
return -1;
}
public:
int findInMountainArray(int target, MountainArray &mountainArr) {
int l = 0, r = mountainArr.length() - 1;
while (l < r) {
int mid = (l + r) / 2;
if (mountainArr.get(mid) < mountainArr.get(mid + 1)) {
l = mid + 1;
} else {
r = mid;
}
}
int peak = l;
int index = binary_search(mountainArr, target, 0, peak, [](int x) -> int{return x;});
if (index != -1) {
return index;
}
return binary_search(mountainArr, target, peak + 1, mountainArr.length() - 1, [](int x) -> int{return -x;});
}
};
lambda在这是怎么用的?
int index = binary_search(mountainArr, target, 0, peak, [](int x) -> int{return x;});
[](int x)是输入类型,得到返回类型
0到peak时升序,key(x)=int{return x;},peak+1到length-1降序,key(x)=int{return -x;}这样左右公用一个函数
在降序的时候,比较规则就不一样了,函数也需要重写,用这种方法可以少写一个函数
key 是一个函数指针,它指向一个函数,该函数接受一个整数参数并返回一个整数值。在这个代码片段中,key 函数的作用是对目标值 target 和数组中的元素进行转换,以满足二分查找的要求。