[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 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...
随机推荐
- [UE4]蓝图转换成C++代码
版本:4.12 1.进行如下设置 2.将项目打包出来(任意一平台都行,本文以Windows为例) 3.打包完成后才会在原项目工程中生成蓝图转换成c++的代码 4.如图路径(转换后的代码路径较深所以一步 ...
- [UE4]计算2点坐标附近的坐标:线性插值法
float distance = FVector::Distance(SelfLocation, TargetLocation); .f / distance; DrawDebugPoint(GetW ...
- Hadoop恢复namenode数据
情景再现: 在修复hadoop集群某一个datanode无法启动的问题时,搜到有一个答案说要删除hdfs-site.xml中dfs.data.dir属性所配置的目录,再重新单独启动该datanode即 ...
- ZooKeeper系列 (4) 构建ZooKeeper应用
原文地址: http://www.cnblogs.com/wuxl360/p/5817540.html 一.配置服务 配置服务是分布式应用所需要的基本服务之一,它使集群中的机器可以共享配置信息中那些公 ...
- T1330 最少步数(#Ⅱ- 8)(广度优先搜索)
[题目描述] 在各种棋中,棋子的走法总是一定的,如中国象棋中马走“日”.有一位小学生就想如果马能有两种走法将增加其趣味性,因此,他规定马既能按“日”走,也能如象一样走“田”字.他的同桌平时喜欢下围棋, ...
- solr5.3的spellcheck功能
1.增加schema.xml中的检查字段. <field name="title" type="text_cn" indexed="true&q ...
- 微信通过openID发送消息/后台post、get提交并接收数据
控制器:下面是post发送消息(微信不支持从前台发送数据,之前试过,报错,需要跨域,跨域的问题解决后还不行,最后发现之后后端提交 WXApi类: #region 验证Token是否过期 /// < ...
- Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目
Spring MVC 学习笔记2 - 利用Spring Tool Suite创建一个web 项目 Spring Tool Suite 是一个带有全套的Spring相关支持功能的Eclipse插件包. ...
- (3/24)轻松配置 webpack3.x入口、出口配置项
在上一节中我们只是简单的尝了一下webpack的鲜,对其有了基本的了解,对于上一节当中的打包方式,在实际开发中并不使用,而是通过webpack的配置文件的方式进行设置的,所以该节就在上一节的基础上学一 ...
- zabbix 主动模式监控
参考网站: http://www.mamicode.com/info-detail-1724685.html http://www.cnblogs.com/dadonggg/p/8609674.ht ...