LC 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 i
jump forward to index j
(with i < 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 <= 20000
0 <= A[i] < 100000
看题要仔细啊
class Solution {
private:
unordered_map<int,bool> mpodd;
unordered_map<int,bool> mpeven;
vector<vector<int>> arr;
public:
int oddEvenJumps(vector<int>& A) {
for(int i=A.size()-; i>=; i--){
int maxval = INT32_MAX, maxidx = -;
int minval = INT32_MIN, minidx = -;
for(int j=i+; j<A.size(); j++){
if(A[j] >= A[i] && A[j] < maxval){
maxidx = j;
maxval = A[j];
}
if(A[j] <= A[i] && A[j] > minval){
minidx = j;
minval = A[j];
}
} vector<int> tmp = {maxidx, minidx};
arr.push_back(tmp);
}
int ret = ;
for(int i=A.size()-; i>=; i--){
if(helper(A, i, true)) ret++;
}
return ret;
}
bool helper(vector<int>& A, int tmpidx, bool odd){
if(tmpidx == A.size()-){
mpodd[tmpidx] = true;
mpeven[tmpidx] = true;
return true;
}else {
if(odd){
if(mpodd.count(tmpidx)) return mpodd[tmpidx];
int nextidx = arr[A.size()- - tmpidx][];
if(nextidx == -) return false;
mpodd[tmpidx] = helper(A, nextidx, !odd);
return mpodd[tmpidx];
}else {
if(mpeven.count(tmpidx)) return mpeven[tmpidx];
int nextidx =arr[A.size()- - tmpidx][];
if(nextidx == -) return false;
mpeven[tmpidx] = helper(A, nextidx, !odd);
return mpeven[tmpidx];
}
}
}
};
LC 975. Odd Even Jump的更多相关文章
- 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 ...
- [LC] 328. Odd Even Linked List
Given a singly linked list, group all odd nodes together followed by the even nodes. Please note her ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
- 【Leetcode周赛】从contest-111开始。(一般是10个contest写一篇文章)
Contest 111 (题号941-944)(2019年1月19日,补充题解,主要是943题) 链接:https://leetcode.com/contest/weekly-contest-111 ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- [ONTAK2010] Peaks 加强版
[ONTAK2010] Peaks 加强版 题目大意:原题变为强制在线查询 Solution 读入山高,排序后依然建立树链,初始化并查集,初始化重构树新节点标号为\(n+1\) 读入边,按照边权从小到 ...
随机推荐
- Spring Cloud(八)高可用的分布式配置中心 Spring Cloud Config
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件.在Spring Cloud中,有分布式配置中心组件spring cloud config,它支持配 ...
- SpEL表达式总结
前言SpEL(Spring Expression Language),即Spring表达式语言,是比JSP的EL更强大的一种表达式语言.为什么要总结SpEL,因为它可以在运行时查询和操作数据,尤其是数 ...
- Oracle权限管理详解(1)
详见:https://www.cnblogs.com/yw0219/p/5855210.html Oracle 权限 权限允许用户访问属于其它用户的对象或执行程序,ORACLE系统提供三种权限:Obj ...
- 【uoj#94】【集训队互测2015】胡策的统计(集合幂级数)
题目传送门:http://uoj.ac/problem/94 这是一道集合幂级数的入门题目.我们先考虑求出每个点集的连通生成子图个数,记为$g_S$,再记$h_S$为点集$S$的生成子图个数,容易发现 ...
- shiro系列一、认识shiro
Apache Shiro是Java的一个安全框架.目前,使用Apache Shiro的人越来越多,因为它相当简单,对比Spring Security,可能没有Spring Security做的功能强大 ...
- 随意软连接/home/users目录导致环境变量消失后的事故
1 自己的用户zj下,把/home/zj 删除后用ln -s软连接其他目录,导致了当前用户的.bash_profile失效 2 解决思路 第一,删除软连接 rm -rf /home/zj 记住后面 ...
- 手动编译用于i.MX6系列ARM的交叉编译SDK
前言: 在前一节中,在使用别的机器(系统:UBUNTU14.04)上编译好的交叉编译SDK,配置在我的电脑(系统:UBUNTU16.04)上,用于bazel编译Tensorflow时会报arm-pok ...
- sentinel.conf 配置
daemonize yes logfile "/home/data/redis/redis_sentinel.log" sentinel monitor mymaster 192. ...
- request.getParameterNames获得请求参数的名字(Get或者Post请求的参数都可以)
1 protected Map<String, String> initRequestParams(HttpServletRequest request) { 2 Map<Strin ...
- ACM-ICPC 2016 大连赛区现场赛 K. Guess the number && HDU 5981(思维+DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5981 题意:A在[L, R]之间随机选取一个数X,之后B来猜这个数,如果猜的数比X小,那么A就告诉B猜 ...