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; } }

本文深入解析LeetCode初级算法题“打家劫舍”,通过动态规划求解连续房屋抢劫问题的最佳策略。文章详细阐述了状态转移方程,即第n个房屋的最大收益取决于第n-2个房屋收益加当前房屋收益,或直接继承第n-1个房屋的最大收益。
2112

被折叠的 条评论
为什么被折叠?



