LeetCode - Medium - 213. House Robber II

Topic

  • Array
  • Dynamic Programming

Description

link

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed. All houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, adjacent houses have a security system connected, and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given an integer array nums representing the amount of money of each house, return the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: nums = [2,3,2]
Output: 3
Explanation: You cannot rob house 1 (money = 2) and then rob house 3 (money = 2), because they are adjacent houses.

Example 2:

Input: nums = [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 3:

Input: nums = [1,2,3]
Output: 3

Constraints:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 1000

Analysis

Carl教程

《剑指Offer-专项突破版》面试题90:环形房屋偷盗

Submissions

public class HouseRobberII {
	
    public int rob(int[] nums) {
        if(nums.length == 0)
        	return 0;
        
        if(nums.length == 1)
        	return nums[0];
    	
    	int first = rob(nums, 0, nums.length - 2);
    	int second = rob(nums, 1, nums.length - 1);
    	
    	return Math.max(first, second);
    }
    
    
    private int rob(int[] nums, int start, int end) {
    	int[] dp = new int[2];
    	
    	dp[0] = nums[start];
    	
    	if(start < end) {
    		dp[1] = Math.max(nums[start], nums[start + 1]);
    	}
    	
    	for(int i = start + 2; i <= end; i++) {
    		int j = i - start;//j初始为2,&1后 dp[0],dp[1],dp[0],...排位
    		dp[j & 1] = Math.max(dp[(j - 2) & 1] + nums[i], dp[(j - 1) & 1]);
    	}
    	
    	return dp[(end - start) & 1];//与for循环内排位同理
    }
    
}

Test

import static org.junit.Assert.*;
import org.junit.Test;

public class HouseRobberIITest {

    @Test
    public void test() {
        HouseRobberII hObj = new HouseRobberII();

        assertEquals(3, hObj.rob(new int[] {2, 3, 2}));
        assertEquals(4, hObj.rob(new int[] {1, 2, 3, 1}));
        assertEquals(3, hObj.rob(new int[] {1, 2, 3}));
    }
}

你可能感兴趣的:(LeetCode,leetcode)