LeetCode 213. 打家劫舍II
阿新 • • 發佈:2020-08-05
題目描述連結: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)。