大意:给一个数组,相邻两个不能取,求取出的最大值。
动态规划题目,先暴力递归,然后拿数组记录重复的,剪枝。
自顶向下解法
class Solution {
public static int[] array = new int[100];
public int solve(int index, int[] nums) {
if (index < 0 || nums == null) {
return 0;
}
if (array[index] != 0) {
return array[index];
}
return array[index] = Math.max(solve(index - 1, nums), solve(index - 2, nums) + nums[index]);
}
public int rob(int[] nums) {
return solve(nums.length - 1, nums);
}
}
解法没问题,但是跑不过用例,因为leetcode不同用例数组会重复,再写一个自底向上的
class Solution {
public int rob(int[] nums) {
int[] array = new int[nums.length];
if (nums.length == 0 || nums == null) {
return 0;
}
if (nums.length == 1) {
return nums[0];
}
array[0] = nums[0];
array[1] = Math.max(nums[0], nums[1]);
for (int i = 2; i < nums.length; i++) {
array[i] = Math.max(array[i - 1], array[i - 2] + nums[i]);
}
return array[nums.length - 1];
}
}