1. 程式人生 > >leetcode 198. House Robber (Easy)

leetcode 198. House Robber (Easy)

返回 一次 lee href tar 最大的 保存 題意 效率

https://leetcode.com/problems/house-robber/

題意:

一維數組,相加不相鄰的數組,返回最大的結果。

思路:

一開始思路就是DP,用一維數組保存dp[i]保存如果偷第i間,此時可偷到多少。DP的方向不太好,所以效率很低。

Runtime: 4 ms, faster than 17.53%

class Solution
{
public:
  int rob(vector<int> &nums)
  {
    int res = 0;
    int len = nums.size();
    if (len <= 0)
      
return res; int dp[len]; for (int i = 0; i < len; i++) { dp[i] = nums[i]; res = max(res, dp[i]); } if (len > 2) { dp[2] += dp[0]; res = max(res, dp[2]); } for (int j = 3; j < len; j++) { dp[j] += max(dp[j - 2], dp[j - 3]); res
= max(res, dp[j]); } return res; } };

後面DP思路改成:dp[i]記錄在偷到第i位時,最大可偷多少錢。

可偷最多的錢要麽是偷這次的,要麽是不偷這一次的。

轉移方程為: dp[i]=max(dp[i-2]+nums[i],dp[i-1])

Runtime: 0 ms, faster than 100.00%

class Solution
{
public:
  int rob(vector<int> &nums)
  {
    int res = 0;
    int len = nums.size();
    if (len <= 0
) return res; if (len == 1) return nums[0]; if (len == 2) return (nums[0] > nums[1] ? nums[0] : nums[1]); int dp[len]; dp[0] = nums[0]; dp[1] = max(nums[0], nums[1]); for (int i = 2; i < len; i++) { dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]); } return dp[len - 1]; } };

leetcode 198. House Robber (Easy)