[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 个单元格,并且在每一个单元格内都有可能放有一石子(也有可能没有). 青蛙可以跳上石头,但是不可以跳入水中. 给定石子的位置列表(用单元格序 ...
随机推荐
- tcp_tw_recycle和tcp_timestamps导致connect失败问题
把服务里面的net.ipv4.tcp_timestamps这个参数设置为0后已经可以正常telnet通了. 具体设置方法: 在/etc/sysctl.conf 里面加入 net.ipv4.tcp_t ...
- 超链接中 utm_source, utm_medium 等参数的含义是什么?
作者:张溪梦 Simon链接:https://www.zhihu.com/question/48724061/answer/122730629来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非 ...
- PHP下载文件的几种方案
PHP下载远程文件的3种方法以及性能考虑 2014-02-21 0个评论 收藏 我要投稿 今天在做导出Excel的时候,总是要测试导出的Excel文件,频繁的下载和打开,很 ...
- Java5,Java 6,Java 7,Java 8新特性
Java5: 1.泛型 Generics: 引用泛型之后,允许指定集合里元素的类型,免去了强制类型转换,并且能在编译时刻进行类型检查的好处. Parameterized Type作为参数 ...
- matlab批量修改图片大小
转自:http://blog.csdn.net/cike0cop/article/details/53087995 %author:coplin %time:2016-10-10 %function: ...
- SpringBoot整合定时任务task
@SpringBootApplication //扫描 mybatis mapper 包路径 @MapperScan(basePackages = "com.imooc.mapper&quo ...
- python3解析XML文件
软硬件环境 Ubuntu 15.10 32bit Python 3.5.1 PyQt 5.5.1 前言 Python解析XML的方法挺多,本文主要是利用ElementTree来完成. 实例讲解 解析X ...
- 下载Chrome独立版(alternate/offline Installer)的地方
因为Great fire wall,Chrome无法更新,下载独立版(alternate/offline Installer)的地方 很多朋友可以用proxy firefox访问google,却无法让 ...
- Openstack虚机实例状态错误手工恢复vm_state:error
Openstack虚机实例状态错误手工恢复vm_state:error 1.找到状态为出错状态的VM.在数据库里面表现Status为ERROR而非ACTIVE. 2.找到出错状态VM的UUID. 3. ...
- C# EF 基础操作
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...