Leetcode 403 青蛙过河 DP

  JAVA:

复制代码
public final boolean canCross(int[] stones) {
        int len = stones.length;
        return jump(stones, 0, 0, new HashMap<Long, Boolean>());
    }

    private final boolean jump(int[] stones, int currPosition, int currStep, Map<Long, Boolean> cache) {
        int len = stones.length;
        if (currPosition == len - 1) return true;
        Long key = ((long) currPosition << 32) | currStep;
        if (cache.containsKey(key)) return cache.get(key);
        if (currPosition == 0) {
            if (stones[1] > 1) return false;
            else return jump(stones, 1, 1, cache);
        }
        int nextPosition = currPosition + 1, nextStep = 0;
        boolean res = false;
        while (nextPosition < len && (nextStep = stones[nextPosition] - stones[currPosition]) <= currStep + 1) {
            if (Math.abs(nextStep - currStep) < 2 && jump(stones, nextPosition, nextStep, cache)) {
                res = true;
                break;
            }
            nextPosition++;
        }
        cache.put(key, res);
        return res;
    }
复制代码

  JS DP:

复制代码
/**
 * @param {number[]} stones
 * @return {boolean}
 */
var canCross = function (stones) {
    return jump(stones, 0, 0, new Map());
};

var jump = function (stone, currPosition, currStep, cache) {
    let len = stone.length;
    if (currPosition == len - 1) return true;
    let key = currPosition + "," + currStep, his;
    if (his = cache.get(key)) return his == 1 ? true : false;
    if (currPosition == 0) {
        if (stone[1] > 1) return false;
        return jump(stone, 1, 1, cache);
    }
    let nextPosition = currPosition + 1, nextStep;
    while (nextPosition < len && (nextStep = stone[nextPosition] - stone[currPosition]) < currStep + 2) {
        if (Math.abs(nextStep - currStep) < 2 && jump(stone, nextPosition, nextStep, cache)) {
            cache.set(key, 1);
            return true;
        }
        nextPosition++;
    }
    cache.set(key, 2);
    return false;
}
复制代码

posted @   牛有肉  阅读(92)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示