import java.util.*; public class Solution { //如果0位置偷,在2-n-2的区域内与打家劫舍1相同 =》nums[0] ,rob1(2,n-2) //如果0位置不偷,就是1-n-1位置进行打家劫舍1. => //rob1(1,n-1); // f[i] 表示偷的最大金额,g[i] 表示不偷的最大金额 public int rob (int[] nums) { int n = nums.length; return Math.max(nums[0] + rob1(nums,2,n-2),rob1(nums,1,n-1)); } //与打家劫舍1逻辑一致 public int rob1(int[]nums,int start,int end){ if(start>end) return 0; int n = nums.length; int[] f= new int [n]; int[] g = new int [n]; //1.初始化 f[start] = nums[start]; //2.填表:只用start -end for(int i =start +1;i<=end; i++){ f[i] = nums[i] +g[i-1]; g[i] = Math.max(g[i-1],f[i-1]); } return Math.max(f[end],g[end]); } }