题目描述

题解
// 该题目可以抽象成:
// nums选取子数组要求各个元素不能相邻,找到子数组求和的最大值,并返回最大和。
// 动态规划
// 动态规划数组dp,dp[i]表示遍历到第i家时,所能求得的最大和,怎么求dp[i]?
// 当我们for循环遍历nums时,对于遍历元素nums[i],
// 如果选择偷的话,此时的最大值就是nums[i]加 上上家的最大值结果dp[i - 2],
// 如果选择不偷,此时的最大值就是上家的最大值结果dp[i - 1]。
// 那对于nums[i]我们偷还是不偷呢?我们选这两种选择的最大值即可,
// 将结果更新到dp[i],就能求得dp[i]。我们最后对所有nums元素遍历,
// 返回dp[nums.length - 1]。
//
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.8 MB, 在所有 Java 提交中击败了60.37%的用户
class Solution {
public int rob(int[] nums) {
if (nums == null || nums.length == 0)
return 0
int len = nums.length
if (len == 1)
return nums[0]
int[] dp = new int[len]
dp[0] = nums[0]
dp[1] = Math.max(nums[1], dp[0])
for (int i = 2
dp[i] = Math.max(nums[i] + dp[i - 2], dp[i - 1])
}
return dp[len - 1]
}
}
// 数组形式的dp都能够转换为非数组形式
//
// 执行用时:0 ms, 在所有 Java 提交中击败了100.00%的用户
// 内存消耗:35.9 MB, 在所有 Java 提交中击败了36.28%的用户
class Solution {
public int rob(int[] nums) {
if (nums == null || nums.length == 0)
return 0
int len = nums.length
if (len == 1)
return nums[0]
int a = nums[0]
int b = Math.max(nums[1], a)
int imax
for (int i = 2
imax = Math.max(nums[i] + a, b)
a = b
b = imax
}
return imax
}
}