[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 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.
[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.
题意:
一只不会游泳的青蛙,从位置0th unit(即我画的图中的第0号石头)出发开始跳,
若前一次它跳了K units,
这次就只能跳 K-1 或者 K 或者 K+1 units,
问青蛙是否能跳到对岸。
思路:
以[0,1,3,5,6,8,12,17]为例自己画了个图,我把units理解为直尺上的刻度,更直观理解题意。
用HashMap套一个set,set内存放last jump的units

首先,遍历一遍给定数组stones = {0,1,3,5,6,8,12,17}, 存入所有给定刻度,初始化HashMap。
Integer(当前刻度) 0 1 3 5 6 8 12 17 Set(last jump units) [] [] [] [] [] [] [] []
然后,初始化0刻度对应的Set为[0]。
Integer(当前刻度) 0 1 3 5 6 8 12 17 Set(last jump units) [0] [] [] [] [] [] [] []
最后,遍历一遍给定数组stones = {0,1,3,5,6,8,12,17}
根据题意,青蛙的下一跳(nextJump)范围取决于上一跳(lastJump)
遍历Set里上一跳的取值
Integer(当前刻度) 0 1 3 5 6 8 12 17
Set(last jump units) [0] [] [] [] [] [] [] []
lastJump 0
nextJump -1
0
1
查找map.containsKey(下一跳的刻度),即 (当前刻度 + nextJump Range)
Integer(当前刻度) 0 1 3 5 6 8 12 17
Set(last jump units) [0] [1] [2] [2] [3,1] [3,2] [4] [5]
lastJump 0 1 2 2 3 1 3 2 4 5
nestJump Range:
(1)lastJump-1 -1 0 1 1 2 0 2 1 3
(2)lastJump 0 1 2 2 3 1 3 2 4
(3)lastJump+1 1 2 3 3 4 2 4 3 5
map.containsKey 0-1✗ 1+0✗ 3+1✗ 5+1✓ 6+2✓ 6+0✗ 8+2✗ 8+1✗ 12+3✗
0+0✗ 1+1✗ 3+2✓ 5+2✗ 6+3✗ 6+1✗ 8+3✗ 8+2✗ 12+4✗
0+1✓ 1+2✓ 3+3✓ 5+3✓ 6+4✗ 6+2✓ 8+4✓ 8+3✗ 12+5✓
代码:
public boolean canCross(int[] stones) {
if (stones.length == 0) return false;
HashMap<Integer, HashSet<Integer>> map = new HashMap<>();
for (int i = 0; i < stones.length; i++) {
map.put(stones[i], new HashSet<>());
}
map.get(0).add(0);
for (int i = 0; i < stones.length; i++) {
for (int lastJump : map.get(stones[i])) {
for (int nextJump = lastJump - 1; nextJump <= lastJump + 1; nextJump++) {
if (nextJump > 0 && map.containsKey(stones[i] + nextJump)) {
map.get(stones[i] + nextJump).add(nextJump);
}
}
}
}
return !map.get(stones[stones.length - 1]).isEmpty();
}
[leetcode]403. 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 ...
- 403 Frog Jump 青蛙过河
一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中.给定石子的位置列表(用单元格序号升序表示), 请判定 ...
- [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] 403. Frog Jump
https://leetcode.com/contest/5/problems/frog-jump/ 这个题目,还是有套路的,之前做过一道题,好像是贪心性质,就是每次可以跳多远,最后问能不能跳到最右边 ...
- 第十七周 Leetcode 403. Frog Jump(HARD) 线性dp
leetcode403 我们维护青蛙从某个石头上可以跳那些长度的距离即可 用平衡树维护. 总的复杂度O(n^2logn) class Solution { public: bool canCross( ...
- 【JavaScript】Leetcode每日一题-青蛙过河
[JavaScript]Leetcode每日一题-青蛙过河 [题目描述] 一只青蛙想要过河. 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有). 青蛙可以跳上石子 ...
- 【leetcode】403. Frog Jump
题目如下: 解题思路:我的做法是建立一个字典dic,key为stone,value是一个set,里面存的是从前面的所有stone跳跃到当前stone的unit集合.例如stones=[0,1,2,3] ...
- 403. Frog Jump
做完了终于可以吃饭了,万岁~ 假设从stone[i]无法跳到stone[i+1]: 可能是,他们之间的距离超过了stone[i]所能跳的最远距离,0 1 3 7, 从3怎么都调不到7: 也可能是,他们 ...
- Java实现 LeetCode 403 青蛙过河
403. 青蛙过河 一只青蛙想要过河. 假定河流被等分为 x 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...
随机推荐
- zabbix企业应用:通过SNMP和iDRAC监控DELL服务器硬件
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://qicheng0211.blog.51cto.com/3958621/174998 ...
- javascript的面向对象思想知识要点
获取数据类型 typeof undefined:访问某个不存在的或未经赋值的变量时就会得到一个 undefined,用typeof 获取类型,得到的也是undefined;null:它不能通过java ...
- labview如何生成可执行文件
labview生成可执行文件可以分为两种情况. 第一种,是电脑中有labview软件开发环境的情况 第二种,是电脑中没有安装labview软件开发环境 下面是一个简单的labview代码: 程序解释: ...
- python的eval、exec函数使用总结
eval函数 一.函数的作用 将字符串str当成有效的表达式来求值并返回计算结果.它要执行的python代码只能是单个运算表达式(不支持任意形式的赋值操作),而不能是复杂的代码逻辑. 二.函数的定义 ...
- IO流程及优化
http://blog.csdn.net/xypzwl/article/details/51416883 一.存储设备的存储原理 机械硬盘: 机械硬盘使用磁性物质作为存储介质,用N.S极性来代表0或1 ...
- springboot的一些配置
spring-boot 1.推荐使用yaml,因为默认的properties需要写更多的前缀 2.使用java -jar 的方式启动jar包的情况下,通过-spring.profiles.actiiv ...
- python之列表操作
1.列表的增操作(四种) append(object):append object to end,directly used on list insert(index,object):insert o ...
- robot framework添加库注意事项
添加库 假设你的项目结构是这样: 项目 ..myLib(库目录) ..目录1 ..测试用例套件1 此时你需要在“测试用例套件1”中用相对路径添加库myLib,你应该填:../myLib/ 特别注意后面 ...
- HTML5 监听移动端浏览器返回键兼容版本
// 往windosw对象中的历史记录注入URL的方法 function addUrl() { var state = { title: "title", url: "# ...
- leetcode349
public class Solution { public int[] Intersection(int[] nums1, int[] nums2) { var list1 = nums1.ToLi ...