LeetCode 213. 打家劫舍II

题目描述链接:https://leetcode-cn.com/problems/house-robber-ii/

此题之前博主发过的打家劫舍问题极为相似,不同的是此次要求第一个房屋和最后一个房屋是相邻的。关键

就是如何将此题转换为像第一题一样的思路求解。由于第一个房屋和最后一个房屋是相邻的,那么第一个房屋

和最后一个房屋最多选择一个也可以都不选,因此将此问题转换为求出不选第一个房屋时的答案,和不选最后

一个房屋时的答案,最后返回两者的最大值即可。其中这两个子问题的求解就类似打家劫舍的问题了,可以参考

博主写过的此篇博客:https://www.cnblogs.com/zzw-/p/13416359.html

最后LeetCode C++求解代码参考如下:

class Solution {
public:
    int rob(vector<int>& nums) {

        
        int len=nums.size();
        if(len==0){
            return 0;
        }
        if(len==1){
            return nums[0];
        }
        if(len==2){
            return max(nums[0],nums[1]);
        }
        int dp[len];
        dp[0]=0;
        dp[1]=nums[1];
        dp[2]=nums[2];
        int maxium1=dp[1];
        for(int i=3;i<len;i++){
           dp[i]=maxium1+nums[i];
           maxium1=max(maxium1,dp[i-1]);
        }
        int ans1=max(dp[len-1],maxium1);
        dp[0]=nums[0];
        dp[1]=nums[1];
        int maxium2=dp[0];
        for(int i=2;i<len-1;i++){
            dp[i]=maxium2+nums[i];
            maxium2=max(maxium2,dp[i-1]);
        }
        int ans2=max(maxium2,dp[len-2]);
        return max(ans1,ans2);

    }
};

时间复杂度:从代码中可以看到为对数组的两次线性遍历故为:O(n) 。空间复杂度:需要一个dp数组记录为:O(n)。

原文地址:https://www.cnblogs.com/zzw-/p/13441946.html