p110 抢劫环形房子(leetcode 213)
一:解题思路
之前做过一道题目p45,就是除掉了首尾相接的条件。那么这个题目的本质用的方法可以和p45一样,只不过要分2次抢而已。第一次抢首位的,不强末尾的,第二次不抢末尾的,要抢首位的。然后取2者中的较大值即可。Time:O(n),Space:O(1)
二:完整代码示例 (C++版和Java版)
C++:
class Solution { private: int rob(vector<int>& nums, int start, int end) { int prev2 = 0, prev1 = 0; for (int i = start; i <=end; i++) { int cur = max(prev1,prev2+nums[i]); prev2 = prev1; prev1 = cur; } return prev1; } public: int rob(vector<int>& nums) { if (nums.size() == 0) return 0; if (nums.size() == 1) return nums[0]; int n = nums.size(); return max(rob(nums,0,n-2),rob(nums,1,n-1)); } };
Java:
class Solution { private int rob(int[] nums,int start,int end) { int prev2=0,prev1=0; for(int i=start;i<=end;i++) { int cur=Math.max(prev1,prev2+nums[i]); prev2=prev1; prev1=cur; } return prev1; } public int rob(int[] nums) { if(nums==null || nums.length==0) return 0; int n=nums.length; if(nums.length==1) return nums[0]; return Math.max(rob(nums,0,n-2),rob(nums,1,n-1)); } }

浙公网安备 33010602011771号