[198] House Robber

  • 题目描述:https://leetcode.com/problems/house-robber/description/
\\代码来自讨论区的网友
\\source: https://leetcode.com/problems/house-robber/discuss/156523/From-good-to-great.-How-to-approach-most-of-DP-problems.
public int rob(int[] nums) {
  if(nums.length==0)
    return 0;
  int prev1 = 0;
  int prev2 = 0;
  for(int num: nums) {
    int tmp = prev1; \\对下一个元素记录其从 0 到前两个数组元素的和的最大值
    prev1 = Math.max(prev2 + num, prev1);
    prev2 = temp;
  }
}
  • 解题思路:
    • 这是一个动态规划的问题,解题的限制是数组中相邻的两个元素不能同时访问。每次判断,对当前的数组元素 nums[i] 是否选取,如果选取 nums[i],那么当前数组元素的前一个元素 nums[i-1] 肯定不会被选择,即到当前数组元素前两个元素的和的最大值加上当前的数组元素的值 prev2 + num[i];如果不选取 nums[i],那么值为到当前数组元素前一个元素的和的最大值。取这两种情况下的最大值作为当前数组元素的值。
    • 由于题目中所只需要得到按照哪种方式选择数组元素可以得到最大值,所以每次对每一个元素 nums[i],只需要保存 prev2 (在 0 到 i-2 中选取元素得到和的最大值)和 prev1(在 0 到 i-1 中选取元素得到和的最大值)。

你可能感兴趣的:([198] House Robber)