975 Odd Even Jump

这就是一个经典的DP题目, 很明显可以把问题转化成小问题。
并用小问题不依赖于大问题。
这样可以得出O(N^2)的解法。
不过很明显还可以优化。
这里要求的是一个数组里面在它后面比他大的最小值的位置。
最简单的办法是用TreeMap, 从后往前放。用value+ 位置去重,NLogN的时间复杂度。
还有一种就是用Stack 来做,就是把 数组先sort一下。
然后对于每个数找他下一个index比他大的, stack里面存了一个index的递增序列。
我这个解法用了TreeMap, 简单呀, 写stack还是蛮长的。

public class Solution {
    /**
     * @param A: An integer array A
     * @return: Return the number of good starting indexes
     */
    
    public int oddEvenJumps(int[] A) {
        int N = A.length;
        TreeMap treeMap = new TreeMap<>();
        boolean[] dpNextOdd = new boolean[N];
        boolean[] dpNextEven = new boolean[N];
        dpNextOdd[N - 1] = true;
        dpNextEven[N - 1] = true;
        int ans = 1;
        treeMap.put(A[N - 1], N - 1);
        for (int i = N - 2; i >= 0; i--) {
            Integer nextOdd = treeMap.ceilingKey(A[i]);
            if (nextOdd != null) {
                dpNextOdd[i] = dpNextEven[treeMap.get(nextOdd)];
                if (dpNextOdd[i]) ans++;
            }
            Integer nextEven  = treeMap.floorKey(A[i]);
            if (nextEven != null) {
                dpNextEven[i] = dpNextOdd[treeMap.get(nextEven)];
            }
            treeMap.put(A[i], i);
        }
        return ans;
    }
}

你可能感兴趣的:(975 Odd Even Jump)