「Leetcode」975. Odd Even Jump(Java)
Posted Thorough Repeater
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「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;
}
}
以上是关于「Leetcode」975. Odd Even Jump(Java)的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 328. Odd Even Linked List
LeetCode OJ 328Odd Even Linked List