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( ...
随机推荐
- Manipulating Data Structures
Computer Science An Overview _J. Glenn Brookshear _11th Edition We have seen that the way data struc ...
- find principles
Computer Science An Overview _J. Glenn Brookshear _11th Edition In this chapter we explore the probl ...
- JDBC 增删查改
public class MemberDaoImpl implements MemberDao { private Connection conn = null; public MemberDaoIm ...
- SQL Server游标【转】
什么是游标 结果集,结果集就是select查询之后返回的所有行数据的集合. 游标则是处理结果集的一种机制吧,它可以定位到结果集中的某一行,多数据进行读写,也可以移动游标定位到你所需要的行中进行操作 ...
- 弄清const与指针、引用之间的关系
const和 define在常量定义上的差别 在C++中,我们可以使用const 或者 宏define来定义常量.但是C++鼓励使用const定义常量,而不是宏define.原因有很多. 1.defi ...
- 日志案例分析(PV,UV),以及动态分区
1.实现的流程 需求分析 时间:日,时段 分区表:两级 PV UV 数据清洗 2015-08-28 18:19:10 字段:id,url,guid,tracktime 数据分析 导出 2.新建源数据库 ...
- 【Android测试】【第五节】LogCat——命令行
◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/4684123.html 前言 上一篇将的是如果在eclips ...
- Python 链接Mysql数据库
参考链接:https://pypi.python.org/pypi/PyMySQL#downloads import pymysql.cursors,xml.dom.minidom # Connect ...
- proxy解析
知其所以然 本文不是教程向,倾向于分析科学上网的一些原理.知其所以然,才能更好地使用工具,也可以创作出自己的工具. 科学上网的工具很多,八仙过海,各显神通,而且综合了各种技术.尝试从以下四个方面来解析 ...
- 怎么修改tabbar的默认选中界面
我用storyboard做了一个tabbar连接3个界面1,2,3 .程序运行默认选中加载最左边的界面1,怎么能让他默认为界面2或者3呢?菜鸟求大神知道 // 默认的selectedInde ...