2025年--Lc183--198. 打家劫舍(菲波那契数列类型)--Java版
1.题目
2.思路
dp[i]的定义就是每次偷的存储最大的金额.
我们需要考虑dp数组的定义、初始化、遍历和结束条件
(1)如果只有一个房间,dp[0]=nums[0],此时能偷的就是该房间。
(2)如果有2个房间,那么能偷的最大数额,dp[i]math.max(nums[0],nums[1])
(3)因为前两个元素都完成了初始化,所以我们从第三个元素开始也就是索引为2的位置开始遍历,遍历到最后一个元素
(4)考虑最后1个房间,如果最后一个房间偷,那么最大金额数=dp[i]+dp[i-2];
如果最后1个房间不偷,那么最大金额数等于dp[i-1]
3.代码实现
class Solution {public int rob(int[] nums) {//定义dp数组,表示偷到的最大金额int[] dp=new int[nums.length];//如果没有房屋if(nums==null||nums.length==0){return 0;}//如果有1个房屋if(nums.length==1){return nums[0];}//dp数组初始化dp[0]=nums[0];dp[1]=Math.max(nums[0],nums[1]);for(int i=2;i<nums.length;i++){//偷当前 + 两格前」和「不偷当前(等于前一格)」二选一dp[i]=Math.max(nums[i]+dp[i-2],dp[i-1]);}//最后返回dp得到的结果return dp[nums.length-1];}
}