我已解决LeetCode's "House Robber" problem,但我无法打印路径。我使用列表尝试了一些技巧,但我总是得到错误的答案。我如何记住上一个决定并删除元素并将元素添加到列表中以获得房屋清单?
public static int rob(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
if (nums.length == 1)
return nums[0];
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < nums.length; i++) {
dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]);
}
return dp[nums.length - 1];
}
答案 0 :(得分:0)
原始问题是here
您可以使用数组path[]
来记忆上一步。在这种情况下,path[i]
表示我们达到i
的索引。
在下面的代码中,res
存储了强盗的最终路径(从1开始的索引)。以nums = [3,6,2,4,5]
为例。 path[]
将为[-2147483648,-2147483648,0,2,2,3]
。然后我们回溯找到路径,它将是[2,5]
。所以强盗将抢劫第二宫和第五宫并获得6+5=11
。
public void rob(int[] nums) {
if (nums == null || nums.length == 0) return;
int[] dp = new int[nums.length + 1];
int[] path = new int[nums.length + 1];
dp[0] = 0;
dp[1] = nums[0];
Arrays.fill(path, Integer.MIN_VALUE);
for (int i = 2; i <= nums.length; i++) {
if (dp[i - 2] + nums[i - 1] > dp[i - 1]) {
path[i] = i - 2;
dp[i] = dp[i - 2] + nums[i - 1];
} else {
path[i] = i - 1;
dp[i] = dp[i - 1];
}
}
LinkedList<Integer> res = new LinkedList<Integer>();
int i = nums.length;
while (i > 0) {
if (path[i] == i - 1) {
i--;
} else {
res.addFirst(i);
i = path[i];
}
}
}