你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素
    就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报
    警。
    给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷
    窃到的最高金额。

    1. 输入:[1,2,3,1] 输出:4
    2. 输入:[2,7,9,3,1] 输出:12
    1. static int maxMoney(int[] nums, int index) {
    2. if ((nums == null) || (index < 0)) {
    3. return 0;
    4. }
    5. if (index == 0) {
    6. return nums[0];
    7. }
    8. return Math.max(maxMoney(nums, index - 2) + nums[index],
    9. maxMoney(nums, index - 1));
    10. }
    11. static int maxMoney(int[] nums) {
    12. if ((nums == null) || (nums.length == 0)) {
    13. return 0;
    14. }
    15. int length = nums.length;
    16. if (length == 1) {
    17. return nums[0];
    18. } /*int[] dp = new int[length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0], nums[1]); for (int i = 2; i < length; i++) { dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 1]); }return dp[length - 1];*/
    19. int first = nums[0];
    20. int second = Math.max(nums[0], nums[1]);
    21. for (int i = 2; i < length; i++) {
    22. int temp = second;
    23. second = Math.max(first + nums[i], second);
    24. first = temp;
    25. }
    26. return second;
    27. }

    如果房子首尾相连:

    1. public int rob(int[] nums) {
    2. int length = nums.length;
    3. if (length == 1) {
    4. return nums[0];
    5. } else if (length == 2) {
    6. return Math.max(nums[0], nums[1]);
    7. }
    8. return Math.max(robRange(nums, 0, length - 2),
    9. robRange(nums, 1, length - 1));
    10. }
    11. public int robRange(int[] nums, int start, int end) {
    12. int first = nums[start];
    13. int second = Math.max(nums[start], nums[start + 1]);
    14. for (int i = start + 2; i <= end; i++) {
    15. int temp = second;
    16. second = Math.max(first + nums[i], second);
    17. first = temp;
    18. }
    19. return second;
    20. }
    1. public int rob(TreeNode root) {
    2. int[] rootStatus = dfs(root);
    3. return Math.max(rootStatus[0], rootStatus[1]);
    4. }
    5. public int[] dfs(TreeNode node) {
    6. if (node == null) {
    7. return new int[] { 0, 0 };
    8. }
    9. int[] l = dfs(node.left);
    10. int[] r = dfs(node.right);
    11. int selected = node.val + l[1] + r[1];
    12. int notSelected = Math.max(l[0], l[1]) + Math.max(r[0], r[1]);
    13. return new int[] { selected, notSelected };
    14. }