[198] House Robber

\\代码来自讨论区的网友
\\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 中选取元素得到和的最大值)。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容