Java 如何在我的代码中使用备忘录?
我有一个问题陈述如下: 你是一名职业抢劫犯,计划抢劫街道两旁的房屋。每间房子都有一定数量的钱,阻止你抢劫每间房子的唯一限制是相邻的房子都连接了安全系统,如果两间相邻的房子在同一晚被闯入,它会自动联系警察 给出一个代表每家每户金额的非负整数列表,确定今晚在不报警的情况下可以抢劫的最大金额 我正在用Java编写代码。我使用动态规划来解决这个问题,代码给出了正确的解决方案。但是,代码效率不高,因为我使用递归,而不是使用记忆来解决问题。如何在代码中使用备忘录的概念来提高代码的效率?这是我的密码:Java 如何在我的代码中使用备忘录?,java,algorithm,dynamic-programming,memoization,Java,Algorithm,Dynamic Programming,Memoization,我有一个问题陈述如下: 你是一名职业抢劫犯,计划抢劫街道两旁的房屋。每间房子都有一定数量的钱,阻止你抢劫每间房子的唯一限制是相邻的房子都连接了安全系统,如果两间相邻的房子在同一晚被闯入,它会自动联系警察 给出一个代表每家每户金额的非负整数列表,确定今晚在不报警的情况下可以抢劫的最大金额 我正在用Java编写代码。我使用动态规划来解决这个问题,代码给出了正确的解决方案。但是,代码效率不高,因为我使用递归,而不是使用记忆来解决问题。如何在代码中使用备忘录的概念来提高代码的效率?这是我的密码: cla
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;
}
}
另外,我的算法的运行时复杂性是多少 解决这个问题不需要记忆, 或递归调用。 一个动态规划解决方案将很好地工作,并且简单得多。 您可以在元素的单次传递中找到解决方案。 考虑该算法:
- 将
初始化为0max
- 对于每套房子,您最多可以抢劫:
- 截至
的最大值+当前房屋的价值房屋[i-2]
- 截至
房屋[i-1]
- 截至
public int rob(int[] nums) {
int max = 0;
int prev = 0;
int prevprev = 0;
for (int current : nums) {
// TODO: 3 lines to solve the puzzle
}
return max;
}
将
n
值的数组memo
初始化为-1以表示数组中没有任何内容。函数的第一行应该检查memo[n]
是否<0,如果是,则执行该操作。最后一行应该返回memo[n]
。然后修改函数,将计算结果存储在memo[n]
中。至于你的复杂性,我相信你的原始形式是O(phi^n)
其中phi=1.618..
。有关原因,请参见关于斐波那契级数的讨论。对于记忆表格,你自己试试。你试过什么?我觉得现在大多数问题都是人们的家庭作业……你想记住什么?这是交给我的任务。我同意。我差点把这个贴出来。但这不是OP的问题,我想用备忘录。您的解决方案只使用dp。无论如何Thanks@user45437很公平。我担心的是,由于内存需求(O(n)
而不是最佳的O(1)
),记忆解决方案不会给出通过的结果。其他人已经在评论中给了你一个回忆录策略,所以如果我现在把它添加到我的答案中是不合适的。我知道这不是你想要的,没关系。