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. 分析:
暴力解法:
首先要明白,不是所有的石头都必须要跳上去,题目没有说清楚,上面的例子也很misleading. 暴力解法很简单,从当前点(石头)和跳到当前点的步数,看后面是否有石头可以reach,如果可以,以那个新的石头和新的步数继续递归,如果我们reach到最后一个石头,return true.
public class Solution {
public boolean canCross(int[] stones) {
if (stones == null || stones.length == ) return true;
if (stones[] - stones[] != ) return false;
return isPossible(stones, , );
}
public boolean isPossible(int[] stones, int start, int jumps) {
if (start == stones.length - )
return true;
for (int i = start + ; i < stones.length; i++) {
int diff = stones[i] - stones[start];
if (diff <= jumps + && diff >= jumps - ) {
if (isPossible(stones, i, diff)) {
return true;
}
}
}
return false;
}
}
方法二:保存跳到某个点的时候的步数,这样,只要最后一个点有步数,我们就可以保证那个点能够被跳到。
public class Solution {
public boolean canCross(int[] stones) {
if (stones == null || stones.length == ) return false;
// Map<position, the # of jumps the frog takes to reach this position>
Map<Integer, Set<Integer>> map = new HashMap<>();
for (int position : stones) {
map.put(position, new HashSet<Integer>());
}
// in order to avoid checking whether the first jump is at position 0 or not,
// we set the # of jumps the frog takes to the first position is 0.
map.get().add();
for (int position : stones) {
for (Integer steps : map.get(position)) {
if (map.containsKey(position + steps - ) && steps - > ) {
map.get(position + steps - ).add(steps - );
}
if (map.containsKey(position + steps) && steps > ) {
map.get(position + steps).add(steps);
}
if (map.containsKey(position + steps + )) {
map.get(position + steps + ).add(steps + );
}
}
}
return map.get(stones[stones.length - ]).size() != ;
}
}
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 ...
- 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 ...
- [Swift]LeetCode403. 青蛙过河 | 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青蛙过河
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- LeetCode403. 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 青蛙跳
A frog is crossing a river. The river is divided into x units and at each unit there may or may not ...
- div 3 frog jump
There is a frog staying to the left of the string s=s1s2…sn consisting of n characters (to be more p ...
- [leetcode] 403. Frog Jump
https://leetcode.com/contest/5/problems/frog-jump/ 这个题目,还是有套路的,之前做过一道题,好像是贪心性质,就是每次可以跳多远,最后问能不能跳到最右边 ...
- 403. Frog Jump
做完了终于可以吃饭了,万岁~ 假设从stone[i]无法跳到stone[i+1]: 可能是,他们之间的距离超过了stone[i]所能跳的最远距离,0 1 3 7, 从3怎么都调不到7: 也可能是,他们 ...
随机推荐
- mysql 插入/更新数据
mysql 插入/更新数据 INSERT 语句 1.一次性列出全部字段的值,例如: INSERT INTO student VALUES('Chenqi','M', 29); INSERT INTO ...
- Fiddler源代码分享
frmViewer.cs: namespace Fiddler{ using Microsoft.Win32; using System; using System.Collecti ...
- JavaScript 中 的prototype和__proto__
1.prototype是函数的一个属性(每个函数都有一个prototype属性),这个属性是一个指针,指向一个对象.它是显示修改对象的原型的属性. 2.__proto__是一个对象拥有的内置属性(请注 ...
- JS网页顶部进度条demo
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- ul li 下的元素内容垂直居中
CSS: <style> * {;; } li { list-style: none; } li span { border: 1px solid red; height: 100px; ...
- mysql中set autocommit=0与start transaction区别
set autocommit=0,当前session禁用自动提交事物,自此句执行以后,每个SQL语句或者语句块所在的事务都需要显示"commit"才能提交事务. start tra ...
- Apple Pay
Apple Pay运行环境:iPhone6以上设备,操作系统最低iOS9.0以上,部分信息设置需要iOS9.2以上.目前还不支持企业证书添加. 环境搭建好后可以在模拟器上面运行,xcode7.2.1+ ...
- 只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs
只有文本编辑器才是王道, 什么ide都是evil的浮云, 看看linus linux的内核开发工具vim emacs [ide is evil] (http://i.cnblogs.com/EditP ...
- thinkphp-3
有两种创建项目的方式: 一是用多个单入口文件, 一个入口文件对应着一个项目, 如前台/后台/会员中心等 二是用一个单入口, 创建项目分组 对于有多个入口文件的 情况, 配置文件的共享问题? 不管是前台 ...
- 关于linux vi命令替换的使用说明
转自:http://os.51cto.com/art/200907/140987.htm vi/vim 中可以使用 :s 命令来替换字符串.以前只会使用一种格式来全文替换,今天发现该命令有很多种写法( ...