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 exist a stone. The frog can jump on a stone, but it must not jump into the water.java

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.ide

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.spa

Note:code

  • 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:blog

[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:get

[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.

分析it

由於每一步能夠走的步長都是有限的,因此想到用dfs來遍歷全部的可能,不過超時了,仍是看了下網友的解答。io

利用一個map來表明從stone到step的映射,表示從這個stone出發的下一步能走多少步長,好比說:ast

[0,1,3,5,6,8,12,17] class

{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]}

由於到第三個石頭只能是第二個石頭走兩步,因此當咱們 到達第三個石頭,再向後出發時,下一步的步長只能是1,2,3。固然,對於最後一個石頭咱們無需計算。

上面的過程就是不斷需找某個石頭,能由它前面的哪些石頭到達,若是按照必定的步數k到達,而且這個步數是上個石頭能夠走的,那麼咱們就能夠在當前stone所對應的step中填加上k-1,k,k+1。若是咱們最後找到了最後一個stone則返回true,而且不須要計算最後的stone所對應的steps。

代碼

import java.util.*; public class LeetCode { public boolean canCross(int[] stones) { if (stones.length == 0) { return true; } HashMap<Integer, HashSet<Integer>> map = new HashMap<Integer, HashSet<Integer>>(stones.length); map.put(0, new HashSet<Integer>()); map.get(0).add(1); for (int i = 1; i < stones.length; i++) { map.put(stones[i], new HashSet<Integer>() ); } for (int i = 0; i < stones.length - 1; i++) { int stone = stones[i]; for (int step : map.get(stone)) { int reach = step + stone; if (reach == stones[stones.length - 1]) { return true; } HashSet<Integer> set = map.get(reach); if (set != null) { set.add(step); if (step - 1 > 0) set.add(step - 1); set.add(step + 1); } } } return false; } }
相關文章
相關標籤/搜索