This solution uses a HashMap
class Solution { public boolean canCross(int[] stones) { int len = stones.length; HashMap < Integer, HashSet < Integer >> stoneToStep = new HashMap < Integer, HashSet < Integer >> (); for (int pos = 0; pos < len; pos++) stoneToStep.put(stones[pos], new HashSet < Integer > ()); stoneToStep.get(0).add(1); for (int position = 0; position < len - 1; position++) { int stone = stones[position]; for (int step: stoneToStep.get(stone)) { int reach = stone + step; if (reach == stones[len - 1]) return true; if (stoneToStep.get(reach) != null) { stoneToStep.get(reach).add(step); stoneToStep.get(reach).add(step + 1); if (step > 1) stoneToStep.get(reach).add(step - 1); } } } return false; } }
Alternate solution can use DFS (Depth First Search)