「Leetcode」975. Odd Even Jump(Java)
阿新 • • 發佈:2019-01-15
.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)