题目描述链接: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)。