「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;
    }
}

转载于:https://www.cnblogs.com/samhx/p/leetcode-0975.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值