1. 程式人生 > 實用技巧 >LeetCode 213. 打家劫舍II

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)。