【问题标题】:DP Solution Not Caching Properly - Time Out Error when input is ~70DP 解决方案未正确缓存 - 输入为 ~70 时出现超时错误
【发布时间】:2021-03-28 07:36:00
【问题描述】:

我正在尝试解决这个问题:https://leetcode.com/problems/divisor-game/

我的递归本身似乎可以工作,但是当输入足够大时出现超时错误 ~ 70。我尝试进行记忆以缓存以前的解决方案,但由于某种原因它似乎不起作用。我不知道为什么。

 /**
     * @param {number} n
     * @return {boolean}
     */
    var divisorGame = function(n) {
       return helper(n);
    };
    
    const helper = (n, cache = {}) => {
        if(n === 1) return false;
        if(n in cache) return cache[n];
      
        
        for(let i = 0; i < n; i++) {
            if(n % i === 0) {
                if(helper(n - 1) === false) return cache[n] = true;
            } 
        }
        
        return cache[n] = false;
        
    }

【问题讨论】:

  • @ggorlen 哎呀。我已将其更正为 if(n in cache) return cache[n];但是我仍然在相同类型的输入中遇到超时错误
  • @ggorlen 好的编辑

标签: javascript algorithm recursion optimization dynamic-programming


【解决方案1】:

你遇到的问题是:

  1. i = 0 开始循环,而问题明确指出0 &lt; i &lt; n
  2. 问题说选择i后,需要将当前的n替换为n - i,但你调用的是helper(n-1)

下面是修正了上述错误的AC代码的实现。

var divisorGame = function(n) {
   return helper(n);
};

const cache = [];

function helper(n){
    if(n === 1) return false;
    if(n in cache) return cache[n];

    for(let i = 1; i < n; i++) {
        if(n % i === 0) {
            if(helper(n-i) == false){
                return cache[n] = true;
            }
        } 
    }
    return cache[n] = false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 2022-07-02
    • 2011-06-15
    • 2019-03-16
    • 2021-10-10
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多