解题思路
使用了三种思路
1.dfs递归
2.带备忘录的dfs递归
3.dp数组动态规划
代码
class Solution {
public int rob(int[] nums) {
return dfs(nums,0);
}
public int dfs(int[] nums,int index){
if (index>=nums.length){
return 0;
}
int money=Math.max(dfs(nums,index+1),nums[index]+dfs(nums,index+2));
return money;
}
}
class Solution {
int[] note;
public int rob(int[] nums) {
note = new int[nums.length];
Arrays.fill(note,-1);
return dfs(nums,0);
}
public int dfs(int[] nums,int index){
if (index>=nums.length){
return 0;
}
if (note[index]!=-1) return note[index];
int money=Math.max(dfs(nums,index+1),nums[index]+dfs(nums,index+2));
note[index] = money;
return money;
}
}
class Solution {
public int rob(int[] nums) {
int n = nums.length;
if (n==1) return nums[0];//只有一间房屋
if (n==0) return 0;//没有房屋
int[] dp = new int[nums.length];
dp[0]=nums[0];
dp[1] = Math.max(nums[0],nums[1]);//两间房里偷钱更多的那一间
for (int i=2;i<nums.length;i++){//从第三间房开始
dp[i]=Math.max(
dp[i-2]+nums[i]//偷着此处的钱
,dp[i-1]);//不偷此处的钱偷的是上一间房间的钱
}
return dp[nums.length-1];
}
}