(Java) LeetCode 198. House Robber —— 打家劫舍

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
             Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
             Total amount you can rob = 2 + 9 + 1 = 12.

哎,现在真是打劫也得会算法写代码,不然都赚不到钱!很简单的一个动态规划的问题,假设dp[i]是截止到nums[i]为止能抢到的最多的钱,那么它要么是抢nums[i],要么不抢。如果抢,那就是dp[i-2] + nums[i],如果不抢,那就是dp[i-1],二者取最大值。观察到dp[i]只和前两个状态有关,所以空间上可以优化成常数。


Java

class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0) return 0;    
        if (nums.length == 1) return nums[0];
        int dp1 = nums[0];
        int dp2 = Math.max(dp1, nums[1]);
        int dp = dp2;
        for (int i = 2; i < nums.length; i++) {
            dp = Math.max(dp1 + nums[i], dp2);
            dp1 = dp2;
            dp2 = dp;
        }
        return dp;
    }
}

猜你喜欢

转载自www.cnblogs.com/tengdai/p/9282378.html
今日推荐