Leetcode: Frog Jump
A frog is crossing a river. The river is divided into x units and at each unit there may or may not exist a stone. The frog can jump on a stone, but it must not jump into the water. Given a list of stones' positions (in units) in sorted ascending order, determine if the frog is able to cross the river by landing on the last stone. Initially, the frog is on the first stone and assume the first jump must be 1 unit. If the frog's last jump was k units, then its next jump must be either k - 1, k, or k + 1 units. Note that the frog can only jump in the forward direction. Note: The number of stones is ≥ 2 and is < 1,100.
Each stone's position will be a non-negative integer < 231.
The first stone's position is always 0.
Example 1: [0,1,3,5,6,8,12,17] There are a total of 8 stones.
The first stone at the 0th unit, second stone at the 1st unit,
third stone at the 3rd unit, and so on...
The last stone at the 17th unit. Return true. The frog can jump to the last stone by jumping
1 unit to the 2nd stone, then 2 units to the 3rd stone, then
2 units to the 4th stone, then 3 units to the 6th stone,
4 units to the 7th stone, and 5 units to the 8th stone.
Example 2: [0,1,2,3,4,8,9,11] Return false. There is no way to jump to the last stone as
the gap between the 5th and 6th stone is too large.
Solution 1: Backtracking, but will TLE
public class Solution {
public boolean canCross(int[] stones) {
HashSet<Integer> stonePos = new HashSet<Integer>();
for (int stone : stones) {
stonePos.add(stone);
}
return helper(stonePos, 0, 0, stones[stones.length-1]);
} public boolean helper(HashSet<Integer> stonePos, int pos, int jump, int last) {
if (pos == last) return true;
for (int diff=-1; diff<=1; diff++) {
int nextJump = jump + diff;
if (nextJump <= 0) continue;
if (stonePos.contains(pos+nextJump)) {
if (helper(stonePos, pos+nextJump, nextJump, last))
return true;
}
}
return false;
}
}
Better Solution: DP (refer to https://discuss.leetcode.com/topic/59903/very-easy-to-understand-java-solution-with-explanations)
Use map to represent a mapping from the stone (not index) to the steps that can be taken from this stone.
so this will be
[0,1,3,5,6,8,12,17]
{17=[], 0=[1], 1=[1, 2], 3=[1, 2, 3], 5=[1, 2, 3], 6=[1, 2, 3, 4], 8=[1, 2, 3, 4], 12=[3, 4, 5]}
Notice that no need to calculate the last stone.
On each step, we look if any other stone can be reached from it, if so, we update that stone's steps by adding step, step + 1, step - 1. If we can reach the final stone, we return true. No need to calculate to the last stone.
public class Solution {
public boolean canCross(int[] stones) {
if (stones.length <= 1) return true;
HashMap<Integer, HashSet<Integer>> map = new HashMap<Integer, HashSet<Integer>>();
for (int stonePos : stones) {
map.put(stonePos, new HashSet<Integer>());
}
map.get(0).add(1);
for (int i=0; i<stones.length-1; i++) {
int stonePos = stones[i];
HashSet<Integer> steps = map.get(stonePos);
for (int step : steps) {
int reach = stonePos + step;
if (reach == stones[stones.length-1]) return true;
HashSet<Integer> set = map.get(reach);
if (set != null) {
set.add(step);
set.add(step+1);
if (step-1 > 0) set.add(step-1);
}
}
}
return false;
}
}
下面我自己写的这个DP思路可能更简单易写一点:维护一个HashMap<int pos, HashSet<Integer> set>, pos是stones数组里第i个石头,set存该石头possible的next jump。所以initialize: map.get(0).add(1). 这个算法没有上面那个快,但是更容易想清楚
public class Solution {
public boolean canCross(int[] stones) {
HashMap<Integer, HashSet<Integer>> map = new HashMap<>();
map.put(0, new HashSet<Integer>());
map.get(0).add(1); for (int i=1; i<stones.length; i++) {
map.put(i, new HashSet<Integer>());
for (int j=0; j<i; j++) {
int dis = stones[i] - stones[j];
HashSet<Integer> setj = map.get(j); //j's possible next jumps
if (setj.contains(dis)) {
if (dis - 1 > 0) map.get(i).add(dis-1);
map.get(i).add(dis);
map.get(i).add(dis+1);
}
}
} return map.get(stones.length-1).size() != 0;
}
}
Leetcode: Frog Jump的更多相关文章
- [LeetCode] Frog Jump 青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- Java for LeetCode 055 Jump Game
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [LeetCode] 45. Jump Game II_ Hard tag: Dynamic Programming
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [leetcode]45. Jump Game II青蛙跳(跳到终点最小步数)
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [LeetCode] 45. Jump Game II 跳跃游戏 II
Given an array of non-negative integers, you are initially positioned at the first index of the arra ...
- [LeetCode] 403. Frog Jump 青蛙跳
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- [leetcode] 403. Frog Jump
https://leetcode.com/contest/5/problems/frog-jump/ 这个题目,还是有套路的,之前做过一道题,好像是贪心性质,就是每次可以跳多远,最后问能不能跳到最右边 ...
- [leetcode]403. Frog Jump青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- 第十七周 Leetcode 403. Frog Jump(HARD) 线性dp
leetcode403 我们维护青蛙从某个石头上可以跳那些长度的距离即可 用平衡树维护. 总的复杂度O(n^2logn) class Solution { public: bool canCross( ...
随机推荐
- Map的数据结构
一:Map<String,Map<String,Map<String,List<A>>>>
- php配置相关
php.ini error_reporting //配置错误的显示方式 display_errors //此项优先级高于error_reporting,如果关闭该项,会返还http状态码,如果开启,则 ...
- Android TextView 显示不全的自动补齐方式
TextView在Android开发中用到的地方应该是很多的.很多时候,TextView会有一行显示不全被截取或者会换行.之前我的解决办法比较笨拙,定死TextView的一行字数长度,最后一个以省略号 ...
- CC Debugger调试下载接口
调试下载接口: 引脚序号 引脚名称 相关说明 1 GND 地线 2 VDD 目标板电源正端 3 DC 调试-时钟线 4 DD 调试-数据线 5 CSn 下载-片选线(低电平有效) 6 SCLK 下载- ...
- docker gitlab,redmine,etc development enviroments
sameersbn-gitlab is better more than officals sameersbn/redmine https://hub.docker.com/r/sameersbn/r ...
- 转:VS2010调试NUnit测试项目 (Running or debugging NUnit tests from Visual Studio without any extensions)
If you write unit tests and use NUnit test framework this may be helpful. I decided to write this si ...
- ArcGIS中添加进自定义的ttf字符标记符号
原文:ArcGIS中添加进自定义的ttf字符标记符号 ArcGIS系统中的样式可能不能满足实际生产需要,为了实现快速制图,可自定义一些样式,以便重复利用. 1. 制作的符号库 使用 FontCre ...
- Magento Service Temporarily Unavailable解决方法
插件升级错误或安装失败时 会出现Service Temporarily Unavailable错误,使网站前台后台都无法显示. 在操作完成的情况下,仍然出现这个错误时可以采用以下方法: 1.删除网站站 ...
- office-002-onenote、word、outlook取消首字母大小写图文详解
此文主要讲述如何取消微软办公软件 onenote.work.outlook 中首字母大写等的自动更正项,其他 office 办公软件相关设置的操作,可参考此文进行相应的设置.希望能对亲有所帮助,若有错 ...
- ant 执行到javac时运行中止,怎么办?
今天下午我用ant,明明都能打出target.后来改了点代码就不行了,执行到compile的javac时运行中止,真是见鬼了. 在ant构建文件上右击,点击"run as"-> ...