【LeetCode】198. House Robber

198. House Robber

Description:
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.
Difficulty:Easy
Example:

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.

方法1: Recursive,Time Limit Exceeded

  • Time complexity : O ( 2 n ) O\left ( 2^n\right ) O(2n)?
  • Space complexity : O ( n ) O\left ( n\right ) O(n)
    思路:
    增加额外函数,选或者不选当前数组,递归。超时,没有多样例测试。
class Solution {
public:
	int rob(vector<int>& nums) {
		return helper(nums, 0);

	}
	int helper(vector<int>& nums, int l) {
		if (l >= nums.size()) return 0;
		return max(helper(nums, l + 2) + nums[l], helper(nums, l + 1));
	}
};

方法2: Dynamic Programming

  • Time complexity : O ( n ) O\left ( n\right ) O(n)
  • Space complexity : O ( 1 ) O\left ( 1\right ) O(1)
    思路:
    三个变量first、second、third代表了计算需要的三个元素
    dp[i] = max(dp[i-1], dp[i-2] + nums[i])
class Solution {
public:
	int rob(vector<int>& nums) {
        if(nums.size() == 0) return 0;
        if(nums.size() == 1) return nums[0];
        int first = nums[0], second = max(nums[0], nums[1]);
        for(int i = 2; i < nums.size(); i++){
            int third = max(first + nums[i], second);
            first = second;
            second = third;
        }
        return second;
    }
};

你可能感兴趣的:(基础算法)