1095. Find in Mountain Array

/**
 * // This is MountainArray's API interface.
 * // You should not implement it, or speculate about its implementation
 * interface MountainArray {
 *     public int get(int index) {}
 *     public int length() {}
 * }
 */
 
class Solution {
    public int findInMountainArray(int target, MountainArray mountainArr) {
        MtA mta = new MtA(mountainArr);
        int TopIndex = getTopIndex(mta);

        int res = exist1(mta, 0, TopIndex, target);
        if(res != -1){
            return res;
        }
        res = exist2(mta, TopIndex, mta.length() - 1, target);
        if(res != -1){
            return res;
        }

        return -1;
    }
    
    public int exist1(MtA mta, int begin, int end, int target){
        if(begin > end){
            return -1;
        }else{
            int mid_index = (begin + end) / 2;
            if(mta.get(mid_index) == target){
                return mid_index;
            }else if(mta.get(mid_index) < target){
                return exist1(mta, mid_index + 1, end, target);
            }else{
                return exist1(mta, begin, mid_index - 1, target);
            }
        }
    }

    public int exist2(MtA mta, int begin, int end, int target){
        if(begin > end){
            return -1;
        }else{
            int mid_index = (begin + end) / 2;
            if(mta.get(mid_index) == target){
                return mid_index;
            }else if(mta.get(mid_index) > target){
                return exist2(mta, mid_index + 1, end, target);
            }else{
                return exist2(mta, begin, mid_index - 1, target);
            }
        }
    }


    public int getTopIndex(MtA mta){
        if(mta.get(mta.length() - 1) > mta.get(mta.length() - 2)){
            return mta.length() - 1;
        }else if(mta.get(0) > mta.get(1)){
            return 0;
        }else{
            return getTopIndexCore(mta, 0, mta.length() - 1);
        }
    }

    public int getTopIndexCore(MtA mta, int begin, int end){
        if(begin == end - 1){
            if(begin == 0){
                return end;
            }else{
                return end - 1;
            }
        }
        int mid_index = (begin + end) / 2;
        if(mta.get(mid_index - 1) < mta.get(mid_index) && mta.get(mid_index) < mta.get(mid_index + 1)){
            return getTopIndexCore(mta, mid_index + 1, end);
        }else if(mta.get(mid_index - 1) > mta.get(mid_index) && mta.get(mid_index) > mta.get(mid_index + 1)) {
            return getTopIndexCore(mta, begin, mid_index - 1);
        }else{
            return mid_index;
        }
    }

    public class MtA{
        private MountainArray mem_Mountain;
        private int[] mem_int;
        private boolean[] mem_bool;
        public MtA(MountainArray a){
            mem_Mountain = a;
            mem_bool = new boolean[a.length()];
            mem_int = new int[a.length()];
        }
        public int get(int index){
            if(mem_bool[index] == false){
                mem_bool[index] = true;
                mem_int[index] = mem_Mountain.get(index);
            }
            return mem_int[index];
        }
        public int length(){
            return mem_Mountain.length();
        }
    }
}

改进版

/**
 * // This is MountainArray's API interface.
 * // You should not implement it, or speculate about its implementation
 * interface MountainArray {
 *     public int get(int index) {}
 *     public int length() {}
 * }
 */
 
class Solution {
    public int findInMountainArray(int target, MountainArray mountainArr) {
        MtA mta = new MtA(mountainArr);
        int TopIndex = findPeak(mta);

        int res = exist1(mta, 0, TopIndex, target);
        if(res != -1){
            return res;
        }
        res = exist2(mta, TopIndex, mta.length() - 1, target);
        if(res != -1){
            return res;
        }

        return -1;
    }
    
    public static int findPeak(MtA mta){
        int begin = 0;
        int end = mta.length() - 2;

        while(begin < end - 1){
            int mid_index = (begin + end) / 2;
            if(mta.get(mid_index) < mta.get(mid_index + 1)){
                begin = mid_index + 1;
            }else{
                end = mid_index;
            }
        }
        if(mta.get(begin) > mta.get(end)){
            return begin;
        }else{
            return end;
        }
    }
    
    public int exist1(MtA mta, int begin, int end, int target){
        if(begin > end){
            return -1;
        }else{
            int mid_index = (begin + end) / 2;
            if(mta.get(mid_index) == target){
                return mid_index;
            }else if(mta.get(mid_index) < target){
                return exist1(mta, mid_index + 1, end, target);
            }else{
                return exist1(mta, begin, mid_index - 1, target);
            }
        }
    }

    public int exist2(MtA mta, int begin, int end, int target){
        if(begin > end){
            return -1;
        }else{
            int mid_index = (begin + end) / 2;
            if(mta.get(mid_index) == target){
                return mid_index;
            }else if(mta.get(mid_index) > target){
                return exist2(mta, mid_index + 1, end, target);
            }else{
                return exist2(mta, begin, mid_index - 1, target);
            }
        }
    }

    public class MtA{
        private MountainArray mem_Mountain;
        private int[] mem_int;
        private boolean[] mem_bool;
        public MtA(MountainArray a){
            mem_Mountain = a;
            mem_bool = new boolean[a.length()];
            mem_int = new int[a.length()];
        }
        public int get(int index){
            if(mem_bool[index] == false){
                mem_bool[index] = true;
                mem_int[index] = mem_Mountain.get(index);
            }
            return mem_int[index];
        }
        public int length(){
            return mem_Mountain.length();
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值