Skip to content

Instantly share code, notes, and snippets.

@RP-3
Created June 15, 2020 04:36
Show Gist options
  • Save RP-3/4e40b9ac8b2fb7abfd31be8136eb375b to your computer and use it in GitHub Desktop.
Save RP-3/4e40b9ac8b2fb7abfd31be8136eb375b to your computer and use it in GitHub Desktop.
/**
* @param {number[]} stones
* @return {boolean}
*/
var canCross = function(stones) {
if(stones[1] !== 1) return false;
const map = new Map();
stones.forEach((distance, index) => {
map.set(distance, index);
});
const memo = new Array(stones.length).fill(0).map(() => new Array(stones.length).fill(null));
const r = (i, prev) => {
if(i === stones.length-1) return true;
if(memo[i][prev] !== null) return memo[i][prev];
const lastJumpDistance = stones[i] - stones[prev];
const jumpMore = stones[i] + lastJumpDistance + 1;
if(map.has(jumpMore) && r(map.get(jumpMore), i)) return memo[i][prev] = true;
const jumpSame = stones[i] + lastJumpDistance;
if(map.has(jumpSame) && r(map.get(jumpSame), i)) return memo[i][prev] = true;
if(lastJumpDistance <= 1) return memo[i][prev] = false;
const jumpLess = stones[i] + lastJumpDistance - 1;
if(map.has(jumpLess) && r(map.get(jumpLess), i)) return memo[i][prev] = true;
return memo[i][prev] = false;
};
return r(1, 0);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment