题解 | 打家劫舍(二)

打家劫舍(二)

https://www.nowcoder.com/practice/a5c127769dd74a63ada7bff37d9c5815

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param nums int整型一维数组
     * @return int整型
     */
    public int rob (int[] nums) {
        if (nums == null || nums.length == 0) {
            return 0;
        }
        if (nums.length == 1) {
            return nums[0];
        }
	  	//第一家打劫
        int[][] dp = new int[nums.length][2];
        dp[0][0] = 0;
        dp[0][1] = nums[0];
		//第一家不打劫
        int[][] dp2 = new int[nums.length][2];
        dp2[0][0] = 0;
        dp2[0][1] = 0;

        for (int i = 1; i < nums.length; i++) {
            if (i >= 2) {
                dp[i][1] = Math.max(dp[i - 1][0], Math.max(dp[i - 2][0],
                                    dp[i - 2][1])) + nums[i];
                dp[i][0] = Math.max(dp[i - 1][1], Math.max(dp[i - 2][0], dp[i - 2][1]));

                dp2[i][1] = Math.max(dp2[i - 1][0], Math.max(dp2[i - 2][0],
                                     dp2[i - 2][1])) + nums[i];
                dp2[i][0] = Math.max(dp2[i - 1][1], Math.max(dp2[i - 2][0], dp2[i - 2][1]));

            } else {
                dp[i][1] = dp[i - 1][0] + nums[i];
                dp[i][0] = dp[i - 1][1];

                dp2[i][1] = dp2[i - 1][0] + nums[i];
                dp2[i][0] = dp2[i - 1][1];
            }
        }
        //第一个不打劫
        int max = Math.max(dp2[nums.length - 1 ][0], dp2[nums.length - 1][1]);
        //第一家打劫
        int max2 = Math.max(dp[nums.length - 2][0], dp[nums.length - 2][1]);

        return   Math.max(max2, max);
    }
}

因为首位相连,所以第一家和最后一家只能打劫一家。

所以定义两个dp数组。一个初始化第一家打劫,一个初始化第一家不打劫。

最后比较最大值。

第一家打劫的只能到到倒数第一家,第一家不打劫的可以到最后一家。

全部评论

相关推荐

Rac000n:淘天-客户运营部-AI研发工程师,智能客服方向,暑期实习招聘,欢迎联系
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务