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));
        }
    }

 

posted @ 2020-04-10 16:33  repinkply  阅读(153)  评论(0)    收藏  举报