1095. 山脉数组中查找目标值

目录

  • 题目
  • 解法
  • 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 和数组中的元素进行转换,以满足二分查找的要求。

上一篇:g9游戏助手(十大手游平台app排行榜)
下一篇:vivoz1x配置(iqoo z1x和红米k30对比)