[LintCode] House Robber II 打家劫舍之二

简介:

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.
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.
Notice
This is an extension of House Robber.
Example
nums = [3,6,4], return 6

LeetCode上的原题,请参见我之前的博客House Robber II

解法一:

class Solution {
public:
    /**
     * @param nums: An array of non-negative integers.
     * return: The maximum amount of money you can rob tonight
     */
    int houseRobber2(vector<int>& nums) {
        if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
        vector<int> a = nums, b = nums;
        a.erase(a.begin()); b.pop_back();
        return max(rob(a), rob(b));
    }
    int rob(vector<int> &nums) {
        if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
        vector<int> dp{nums[0], max(nums[0], nums[1])};
        for (int i = 2; i < nums.size(); ++i) {
            dp.push_back(max(dp[i - 2] + nums[i], dp[i - 1]));
        }
        return dp.back();
    }
};

解法二:

class Solution {
public:
    /**
     * @param nums: An array of non-negative integers.
     * return: The maximum amount of money you can rob tonight
     */
    int houseRobber2(vector<int>& nums) {
        if (nums.size() <= 1) return nums.empty() ? 0 : nums[0];
        return max(rob(nums, 0, nums.size() - 1), rob(nums, 1, nums.size()));
    }
    int rob(vector<int> &nums, int left, int right) {
        int a = 0, b = 0;
        for (int i = left; i < right; ++i) {
            int m = a, n = b;
            a = n + nums[i];
            b = max(m, n);
        }
        return max(a, b);
    }
};

本文转自博客园Grandyang的博客,原文链接:打家劫舍之二[LintCode] House Robber II ,如需转载请自行联系原博主。

相关文章
|
C++ 网络架构
【PAT甲级 - C++题解】1013 Battle Over Cities
【PAT甲级 - C++题解】1013 Battle Over Cities
65 1
ACM刷题之路(二十二)多重背包转01背包 HDU 1171
ACM刷题之路(二十二)多重背包转01背包 HDU 1171
|
Python
Python每日一练(20230513) 粉刷房子 I\II\III Paint House
Python每日一练(20230513) 粉刷房子 I\II\III Paint House
162 0
|
存储
UPC组队第三场——K: A Famous Grid (BFS+细节)
UPC组队第三场——K: A Famous Grid (BFS+细节)
87 0
UPC组队第三场——K: A Famous Grid (BFS+细节)
|
机器学习/深度学习 Java
杭电1284钱币兑换问题—背包dp/母函数(java)
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
142 0
|
机器学习/深度学习 存储 算法
LintCode 题解丨大厂面试题:N皇后问题
LintCode 题解丨大厂面试题:N皇后问题
LintCode 题解丨大厂面试题:N皇后问题