1. 程式人生 > >「Leetcode」975. Odd Even Jump(Java)

「Leetcode」975. Odd Even Jump(Java)

.get result 元素 jump 依然 情況 函數 true test

分析

註意到跳躍的方向是一致的,所以我們需要維護一個數接下來跳到哪裏去的問題。換句話說,就是對於一個數\(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;
    }
}

「Leetcode」975. Odd Even Jump(Java)