LeetCode-探索-初级算法-动态规划-4. 打家劫舍(个人做题记录,不是习题讲解)
LeetCode探索-初级算法:https://leetcode-cn.com/explore/interview/card/top-interview-questions-easy/
- 打家劫舍
-
语言:java
-
思路:假设总共5个,那么第5个获取的最大值就是第3个能获取到的最大值加上第5个or第4个的最大值;第3个的最大值就是第1个+自己,或者第2个;
即第n个的最大值情况有两种:
第一种是第n-2最大值+自己
第二种是第n-1最大值(因为n-1往回推的情况比自己这条路线好)
-
代码(0ms):
class Solution { public int rob(int[] nums) { if(nums.length == 0) return 0; if(nums.length == 1) return nums[0]; if(nums.length == 2) return Math.max(nums[0],nums[1]); int[] tmp = new int[nums.length]; tmp[0] = nums[0]; tmp[1] = Math.max(nums[0],nums[1]); for(int i = 2; i < nums.length; ++i){ int t = nums[i] + tmp[i-2]; if(t<tmp[i-1]) tmp[i] = tmp[i-1]; else tmp[i] = t; } return tmp[nums.length-1]; } }
-
参考代码(0ms):这个参考代码和我的思路差不多,只不过他变成n[i]一定是以nums[i]结尾,而我是n[i]就是第i时的最大情况
class Solution { public int rob(int[] nums) { if (nums == null || nums.length == 0) { return 0; } if (nums.length == 1) { return nums[0]; } if (nums.length == 2) { return Math.max(nums[0], nums[1]); } // dp[i] 以 nums[i]为最后一个数字的金额 int[] dp = new int[nums.length]; int maxAmount = Math.max(nums[0], nums[1]); dp[0] = nums[0]; dp[1] = nums[1]; for (int i = 2; i < nums.length; i++) { if (i >= 3) { dp[i] = Math.max(dp[i - 2], dp[i - 3]) + nums[i]; } else { dp[i] = dp[i - 2] + nums[i]; } maxAmount = Math.max(maxAmount, dp[i]); } return maxAmount; } }