zoukankan      html  css  js  c++  java
  • 「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;
        }
    }
    
  • 相关阅读:
    Cookie和Session
    Csrf
    Django中间件
    ORM操作
    Django框架简介
    Django之模型的高级用法
    Linux基础(二)之命令
    01 numpy库(一)
    Django之缓存配置
    20 Django REST Framework 更改PUT/PATCH/DELETE的传参字段,默认为pk
  • 原文地址:https://www.cnblogs.com/samhx/p/leetcode-0975.html
Copyright © 2011-2022 走看看