如何在我的代码中使用memoization?

时间:2017-11-21 20:28:09

标签: java algorithm dynamic-programming memoization

我有一个问题陈述如下: 你是一个专业的强盗,计划在街上抢劫房屋。每个房子都有一定数量的钱存在,阻止你抢劫他们的唯一限制是相邻的房屋连接了安全系统,如果两个相邻的房子在同一个晚上被闯入,它将自动联系警察。

给出一个代表每个房子的金额的非负整数列表,确定今晚可以抢劫的最高金额,而不会警告警察。

我用Java编写代码。我正在使用动态编程来解决这个问题,代码为我提供了正确的解决方案。但是,代码效率不高,因为我使用递归而不使用memoization来解决问题。如何在此代码中使用memoization的概念来使我的代码高效?这是我的代码:

class Solution {

    public int rob(int[] nums) {
        return robmax(nums,nums.length-1);    
    }

    public int robmax(int[] nums,int n) {
        int max = 0;
        if(nums.length==0) return 0;
        if(n==1) return Math.max(nums[0],nums[1]);
        if(n==0) return nums[0];
        else{
            max = Math.max(nums[n]+robmax(nums,n-2),robmax(nums,n-1));
        }
        return max;
    }
}

此外,我的算法的运行时复杂性是多少。

1 个答案:

答案 0 :(得分:1)

你不需要记忆来解决这个问题, 或递归调用。 动态编程解决方案可以很好地工作,也可以更加简单。 您可以通过元素一次性找到解决方案。 考虑这个算法:

  • User.findOne({ username: username }, (err, result) => { if (err) throw err; if (result) throw('User already exists!'); }); 初始化为0
  • 对于每个房子,您可以抢劫的最大值是:
    • const User = new Schema({ name: String, email: String, username: { type: String, unique: true }, password: String }) 的最大值+当前房屋的价值
    • max
    • 的最大值

即,跟踪前一个房屋的已知最大值和前一个房屋的已知最大值。 到达最后一所房子时,您将获得累积的最大金额。 这是大纲,我希望我不会破坏这个练习:

house[i-2]