我有一个问题陈述如下: 你是一个专业的强盗,计划在街上抢劫房屋。每个房子都有一定数量的钱存在,阻止你抢劫他们的唯一限制是相邻的房屋连接了安全系统,如果两个相邻的房子在同一个晚上被闯入,它将自动联系警察。
给出一个代表每个房子的金额的非负整数列表,确定今晚可以抢劫的最高金额,而不会警告警察。
我用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;
}
}
此外,我的算法的运行时复杂性是多少。
答案 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]