975. Odd Even Jump
You are given an integer array
A. From some starting index, you can make a series of jumps. The (1st, 3rd, 5th, ...) jumps in the series are called odd numbered jumps, and the (2nd, 4th, 6th, ...) jumps in the series are called even numbered jumps.You may from index
ijump forward to indexj(withi < j) in the following way:
- During odd numbered jumps (ie. jumps 1, 3, 5, ...), you jump to the index j such that
A[i] <= A[j]andA[j]is the smallest possible value. If there are multiple such indexesj, you can only jump to the smallest such indexj.- During even numbered jumps (ie. jumps 2, 4, 6, ...), you jump to the index j such that
A[i] >= A[j]andA[j]is the largest possible value. If there are multiple such indexesj, you can only jump to the smallest such indexj.- (It may be the case that for some index
i,there are no legal jumps.)A starting index is good if, starting from that index, you can reach the end of the array (index
A.length - 1) by jumping some number of times (possibly 0 or more than once.)Return the number of good starting indexes.
Example 1:
Input: [10,13,12,14,15]
Output: 2
Explanation:
From starting index i = 0, we can jump to i = 2 (since A[2] is the smallest among A[1], A[2], A[3], A[4] that is greater or equal to A[0]), then we can't jump any more.
From starting index i = 1 and i = 2, we can jump to i = 3, then we can't jump any more.
From starting index i = 3, we can jump to i = 4, so we've reached the end.
From starting index i = 4, we've reached the end already.
In total, there are 2 different starting indexes (i = 3, i = 4) where we can reach the end with some number of jumps.Example 2:
Input: [2,3,1,1,4]
Output: 3
Explanation:
From starting index i = 0, we make jumps to i = 1, i = 2, i = 3: During our 1st jump (odd numbered), we first jump to i = 1 because A[1] is the smallest value in (A[1], A[2], A[3], A[4]) that is greater than or equal to A[0]. During our 2nd jump (even numbered), we jump from i = 1 to i = 2 because A[2] is the largest value in (A[2], A[3], A[4]) that is less than or equal to A[1]. A[3] is also the largest value, but 2 is a smaller index, so we can only jump to i = 2 and not i = 3. During our 3rd jump (odd numbered), we jump from i = 2 to i = 3 because A[3] is the smallest value in (A[3], A[4]) that is greater than or equal to A[2]. We can't jump from i = 3 to i = 4, so the starting index i = 0 is not good. In a similar manner, we can deduce that:
From starting index i = 1, we jump to i = 4, so we reach the end.
From starting index i = 2, we jump to i = 3, and then we can't jump anymore.
From starting index i = 3, we jump to i = 4, so we reach the end.
From starting index i = 4, we are already at the end.
In total, there are 3 different starting indexes (i = 1, i = 3, i = 4) where we can reach the end with some number of jumps.Example 3:
Input: [5,1,3,4,2]
Output: 3
Explanation:
We can reach the end from starting indexes 1, 2, and 4.
Note:
1 <= A.length <= 200000 <= A[i] < 100000
Approach: #1: DP + Binary search. [C++]
class Solution {
public:
int oddEvenJumps(vector<int>& A) {
const int n = A.size();
vector<vector<int>> dp(n+1, vector<int>(2, 0));
dp[n-1][0] = dp[n-1][1] = 1;
map<int, int> m;
m[A[n-1]] = n - 1;
int ans = 1;
for (int i = n-2; i >= 0; --i) {
auto u = m.lower_bound(A[i]);
if (u != m.end()) {
int idx = u->second;
dp[i][1] = dp[idx][0];
}
auto d = m.upper_bound(A[i]);
if (d != m.begin()) {
int idx = prev(d)->second;
dp[i][0] = dp[idx][1];
}
if (dp[i][1] == 1) ++ans;
m[A[i]] = i;
}
return ans;
}
};
Approach #2: DP. [Java]
class Solution {
public int oddEvenJumps(int[] A) {
int n = A.length, res = 1;
boolean[] higher = new boolean[n], lower = new boolean[n];
higher[n-1] = lower[n-1] = true;
TreeMap<Integer, Integer> map = new TreeMap<>();
map.put(A[n-1], n-1);
for (int i = n-2; i >= 0; --i) {
Map.Entry hi = map.ceilingEntry(A[i]), lo = map.floorEntry(A[i]);
if (hi != null) higher[i] = lower[(int)hi.getValue()];
if (lo != null) lower[i] = higher[(int)lo.getValue()];
if (higher[i]) ++res;
map.put(A[i], i);
}
return res;
}
}
Analysis:
Odd jump: find the smallest value greater than self(up)
Even jump: find the largest value smaller than self(down)
map<int, int> -> min index of the given value
dp[i][1] : can reach end starting with a up jump
dp[i][0] : can reach end starting with a down jump
Start from the (n-2)th element, find a valid up jump index j (lower_bound), and find a valid down jump index k (prev(upper_bound)).
dp[i][1] = dp[j][0]; // next jump will be odd (down)
dp[i][0] = dp[j][1]; // next jump will be even (up)
ans = sum(dp[*][1])
Time Complexity: O(nlogn)
Space Complexity: O(n)
Reference:
https://zxi.mytechroad.com/blog/dynamic-programming/leetcode-975-odd-even-jump/
https://blog.csdn.net/yaomingyang/article/details/78748130
http://www.cplusplus.com/reference/iterator/prev/
https://docs.oracle.com/javase/8/docs/api/java/util/Map.Entry.html
975. Odd Even Jump的更多相关文章
- LC 975. Odd Even Jump
You are given an integer array A. From some starting index, you can make a series of jumps. The (1 ...
- 【LeetCode】975. Odd Even Jump 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 动态规划 日期 题目地址:https://leetc ...
- 「Leetcode」975. Odd Even Jump(Java)
分析 注意到跳跃的方向是一致的,所以我们需要维护一个数接下来跳到哪里去的问题.换句话说,就是对于一个数\(A_i\),比它大的最小值\(A_j\)是谁?或者反过来. 这里有两种方案,一种是单调栈,简单 ...
- [Swift]LeetCode975. 奇偶跳 | Odd Even Jump
You are given an integer array A. From some starting index, you can make a series of jumps. The (1 ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...
- ARM详细指令集
算术和逻辑指令 ADC : 带进位的加法 (Addition with Carry) ADC{条件}{S} <dest>, <op 1>, <op 2> dest ...
- Complete The Pattern #6 - Odd Ladder
Complete The Pattern #6 - Odd Ladder Task: You have to write a function pattern which creates the fo ...
随机推荐
- 有关于mfc webbrowser插件的使用
最近写的东西中常常需要嵌入一些浏览器,微软提供了一个比较好的接口,可以在MFC写的程序中嵌入一个简易的浏览器,是以ActiveX插件的形式提供的接口,使用起来也比较的方便,这里我就简单记录下这个插件的 ...
- CookiesHelper
/// <summary> ///CookiesHelper 的摘要说明 /// </summary> public class CookiesHelper { public ...
- tp5.1注册路由后接收不到参数
- vue父子间通信
父组件是通过props属性给子组件通信的来看下代码: 父组件: <parent> <child :child-com="content"></chil ...
- JSONModel简便应用
JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事 ...
- php-生成数据库设计文档
在线以及提供下载数据库设计文档 $dbserver = "192.168.128.190:42578"; $dbusername = "root"; $dbpa ...
- 2018.07.23[PA2015]Siano(线段树)
[PA2015]Siano 描述 Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会长高a[i]厘 ...
- docker入门实战
基本概念 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上. Docker是一个重新定义了程序开发测试.交付和 ...
- 静态代码块和this
/* 静态代码块.随着类的加载而执行.而且只执行一次. 作用: 用于给类进行初始化. */class StaticCode{ static int num ; static { num = 10;// ...
- 基于SceneControl的三维GIS开发
在ArcGIS体系中,三维开发包括两种:基于Scene的三维开发和基于Globe的三维开发. 由上图可以看出,两种开发的接口都很相似,掌握了Scene开发会相对容易的过渡到Globe开发中. 正如上图 ...