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( ...
随机推荐
- Keepalived安装及初步使用
一.基本规划VIP:192.168.1.11Master:192.168.1.105Backup:192.168.1.102二.安装主备分别安装keepalivedyum -y install kee ...
- a compromise between lock overhead and data safety
High Performance My SQL THIRD EDITION A locking strategy is a compromise between lock overhead and ...
- 不遗留问题-menu数据拼装-2
$res = array(); foreach($idlist_1 as $id1) { $tmp = array(); $tmp1 = array(); $tmp1[] = $id1; foreac ...
- servlet等一些砸碎的
1:servlet 中的synchronized 关键字能保证一次只有一个线程 2:servlet的线程问题只有在大量的方位时 3:AutoCloseable接口:资源自动关闭 4:EntityUti ...
- JBoss的安装与配置(对应eclipse配置)【转】
安装JBoss纯粹是目的就是学习EJB3...至少现在是这样的 EJB需要运行在EJB容器中.每个J2EE应用服务器都含有EJB容器和Web容器.这样,既支持运行EJB,也可以运行Web应用 目前EJ ...
- Liunx 下使用cmake
参考 http://blog.chinaunix.net/uid-28458801-id-3501768.html http://www.ibm.com/developerworks/cn/linux ...
- ubuntu下交叉编译windows c程序
简介 采用mingw32可以在linux下直接编译c程序输出为windows下的exe程序或dll链接库. 个人编译的纯c程序(不含winapi),主要是c99程序,通常采用gcc/cc编译调试后,再 ...
- Qt设置系统时间(使用SetSystemTime API函数)
大家都知道Qt中有QDateTime等有关时间与日期的类,类中包含很多成员函数,可以很方便的实现有关时间与日期的操作,比如:想要获得系统当前的时间与日期,可以调用currentDateTime(); ...
- mvc EF 数据保存时,报错:”对一个或多个实体的验证失败……“之解决
在EF5.0添加实体数据到数据库的时候,出现“对一个或多个实体的验证失败.有关详细信息,请参见“EntityValidationErrors”属性这个错误 解决: SaveChanges前先关闭验证实 ...
- img图片之间的间距问题
[问题]页面中如果有多张图片,那么图片之间会有一些间距,在某些情况下(如切好的图片再次拼接),在显示上就会出现一些问题.效果如下: 对应代码: <div class="f0" ...