「Leetcode」975. Odd Even Jump(Java)

分析

注意到跳跃的方向是一致的,所以我们需要维护一个数接下来跳到哪里去的问题。换句话说,就是对于一个数\(A_i\),比它大的最小值\(A_j\)是谁?或者反过来。
这里有两种方案,一种是单调栈,简单说一下思路:维护一个递减的单调栈,每次放入元素时将比它大的栈顶元素弹出(说明这些元素都能在递减的情况下都能跳到它),直到没有元素或者没有符合条件的元素位置。反过来依然,然后扫一遍就可以了。
这里采用Java的TreeMap解决问题(也就是c++的map)。我们倒过来遍历一遍这个数组,那么只要TreeMap有值,它一定是最远的,一定能够去更新其他值(dp思想)。然后利用TreeMap带的两个函数即可。
WA了7遍,爽诶.jpg

代码

class Solution {
    public int oddEvenJumps(int[] A) 
    {
        int size = A.length;
        boolean[] odd = new boolean[size],
                  even = new boolean[size];
        
        TreeMap<Integer, Integer> tm = new TreeMap<>();

        odd[size-1] = even[size-1] = true;
        tm.put(A[size-1], size-1);
        int ret = 1;
        for(int i=size-2; i>=0; --i)
        {
            Integer ceil = tm.ceilingKey(A[i]),
                    floor= tm.floorKey(A[i]); // the greatest key <= the given key or null
            
            if(ceil != null)
                odd[i] = even[tm.get(ceil)];
            if(floor!= null)
                even[i]= odd[tm.get(floor)];
            if(odd[i]) ret++;

            tm.put(A[i],i); // as a result, it will always keep a biggest pos of A[i].
        }
        return ret;
    }
}
posted @ 2019-01-15 04:28  ISoLT  阅读(489)  评论(0编辑  收藏  举报