力扣1095——山脉数组中查找目标值(二分)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
三步走,找最大坐标,在左边找,在右边找

先二分找最大值所在地;

然后在左半边二分的找目标(升序);

在右半边找目标(降序);

建立一个数组记录已访问节点,减少重复访问次数;

/**
 * // 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 {
private:
    vector<int> vised;
public:
    int getval(int id, MountainArray &mou) {
        if(vised[id] < 0) vised[id] = mou.get(id);
        return vised[id];
    }
    int findInMountainArray(int target, MountainArray &mou) {
        int n = mou.length(); vised = vector<int>(n, -1);
        vised[0] = getval(0, mou), vised[n - 1] = getval(n - 1, mou);
        if(target == vised[0]) return 0;
        if(target < vised[0] && target < vised[n - 1]) return -1;
        int l = 0, r = n - 1;
        int max_pos = 0;
        while(l <= r) {
            int mid = (l + r ) >> 1;
            int a = getval(mid - 1, mou), b = getval(mid, mou), c = getval(mid + 1, mou);
            if(b > a && b > c) {
                max_pos = mid;
                break;
            }
            else if(b > a && b < c) l = mid + 1;
            else r = mid;          
        }
        l = 0, r = max_pos;
        while(l <= r) {
            int mid = (l + r) >> 1, a = getval(mid, mou);
            if(a == target) return mid;
            else if(a < target) l = mid + 1;
            else r = mid - 1;            
        }
        l = max_pos, r = n - 1;
        while(l <= r) {
            int mid = (l + r) >> 1, a = getval(mid, mou);
            if(a == target) return mid;
            else if(a < target) r = mid - 1;
            else l = mid + 1;
        }
        return -1;       
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值