分析

注意到跳跃的方向是一致的,所以我们需要维护一个数接下来跳到哪里去的问题。换句话说,就是对于一个数\(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)的更多相关文章

  1. 「Leetcode」14. Longest Common Prefix(Java)

    分析 与其说是算法题,不如说是语言特性题. 这题要是对Java的String相关函数掌握的比较熟练,写起来的速度(各种意义上)就会很快. 大致的思路都是一致的,差不到哪里去,无非是枚举长度.值得一提的 ...

  2. 「Leetcode」13. Roman to Integer(Java)

    分析 把具体的情况一个一个实现即可,没有什么幺蛾子. 代码 class Solution { public int romanToInt(String s) { int ans = 0; for (i ...

  3. 「Leetcode」976. Largest Perimeter Triangle(C++)

    分析 好久不刷题真的思维僵化,要考虑到这样一个结论:如果递增的三个数\(x_i,x_{i+1},x_{i+2}\)不符合题意,那么最大的两边之差一定大于等于第一条边,那么任何比第一条边小的都不能成立. ...

  4. 「汇编」加深理解段地址*10H(*16)必须是16的倍数

    王爽的汇编语言,有这样一道题: 检测点2.2 (2)  有一数据存放在内存20000H单元中,现给定段地址为SA,若想用偏移地址寻到此单元.则SA应满足的条件是:最小为         , 最大为   ...

  5. 「LuoguP1429」 平面最近点对(加强版)

    题目描述 给定平面上n个点,找出其中的一对点的距离,使得在这n个点的所有点对中,该距离为所有点对中最小的 输入输出格式 输入格式: 第一行:n:2≤n≤200000 接下来n行:每行两个实数:x y, ...

  6. 【LeetCode】975. Odd Even Jump 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...

  7. LOJ 2554 「CTSC2018」青蕈领主——结论(思路)+分治FFT

    题目:https://loj.ac/problem/2554 一个“连续”的区间必然是一个排列.所有 r 不同的.len 最长的“连续”区间只有包含.相离,不会相交,不然整个是一个“连续”区间. 只有 ...

  8. LeetCode第8场双周赛(Java)

    这次我只做对一题. 原因是题目返回值类型有误,写的是 String[] ,实际上应该返回 List<String> . 好吧,只能自认倒霉.就当涨涨经验. 5068. 前后拼接 解题思路 ...

  9. [LeetCode]14.最长公共前缀(Java)

    原题地址: longest-common-prefix 题目描述: 编写一个函数来查找字符串数组中的最长公共前缀. 如果不存在公共前缀,返回空字符串 "". 示例 1: 输入:st ...

随机推荐

  1. mysql驱动jar包下载

    1.百度 maven-repo,进入maven-repo官网查找 2.查找,  如下图: 查找mysql驱动包 3.下载mysql驱动包: 4.选择版本: 5.下载:

  2. JDK(四)JDK1.8源码分析【排序】DualPivotQuicksort

    本文转载自于晓飞93,原文链接 DualPivotQuickSort 双轴快速排序 源码 笔记 DualPivotQuicksort是Arrays类中提供的给基本类型的数据排序的算法.它针对每种基本数 ...

  3. lwip TCP client 客户端 & FreeRTOS

    static void tcpecho_thread(void *arg) { ip_addr_t serverIpAddr; struct netbuf *buf; void *data; u16_ ...

  4. HDFS的Write过程

    hadoop中重要的组成部分HDFS,它所发挥的重要作用是进行文件的后端存储.HDFS针对的是低端的服务器,场景为读操作多.写操作少的情况.在分布式存储情况下,比较容易出现的情况是数据的损害,为了保证 ...

  5. 处理HTML表单(11)

    PHP和Web表单 <?php if(isset($_POST["name"])){//isset()函数设置变量是否设置,并且不能为空 $name = $_POST[&qu ...

  6. HashMap源码阅读与解析

    目录结构 导入语 HashMap构造方法 put()方法解析 addEntry()方法解析 get()方法解析 remove()解析 HashMap如何进行遍历 一.导入语 HashMap是我们最常见 ...

  7. kafka restful api功能介绍与使用

    前述 采用confluent kafka-rest proxy实现kafka restful service时候(具体参考上一篇笔记),通过http协议数据传输,需要注意的是采用了base64编码(或 ...

  8. Android签名生成和互转

    原文链接:http://blog.votzone.com/2018/05/05/android_signature.html   Android 的签名有两种方式,一种使用jdk 提供的jarsign ...

  9. C++练习 | 递归创建二叉树并求叶子结点的数值和

    #include <iostream> using namespace std; struct Tree { int data; Tree *lchild; Tree *rchild; } ...

  10. node.js的http模块创建基本Web服务器

    首先下载node.js模块.终端执行命令 npm i node -g 引入http核心模块 const http =require('http') 引入文件系统模块 const fs =require ...