213. House Robber II

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了213. House Robber II相关的知识,希望对你有一定的参考价值。

After robbing those houses on that street, the thief has found himself a new place for his thievery so that he will not get too much attention. This time, all houses at this place are arranged in a circle. That means the first house is the neighbor of the last one. Meanwhile, the security system for these houses remain the same as for those in the previous street.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the 


解法:

该题目和第一个版本的不同点是,这里的房子时围成圆,相邻的两个房子不能同时被抢,

参考第一版本的方法,需要注意:

a)当第一个房子被抢时,最后一个房子不能被抢 即抢劫范围[0,n-2]

b)当第一个房子没被抢时,最后一个房子可以被抢,[1,n-1]


则需要对这两种情况,分别执行rob程序,取两种情况的最大值为最终结果


 int robCore(vector<int> &table,vector<int> &nums,int start,int end){

        if(start>end)

            return 0;

        if(table[start]!=-1)

            return table[start];

        int robed=nums[start]+robCore(table,nums,start+2,end);

        int nonRobed=robCore(table,nums,start+1,end);

        table[start]=max(robed,nonRobed);

        return table[start];

    }

    int rob(vector<int>& nums) {

        int size=nums.size();

        if(size==0)

            return 0;

        if(size==1)

            return nums[0];

        vector<int> table(size,-1);

        int robed= nums[0]+robCore(table,nums,2,size-2);

       vector<int> table2(size,-1);

        int nonrobed=robCore(table2,nums,1,size-1);

        return max(robed,nonrobed);

    }


解法二

同第一版本,同样可以用迭代方式求动态规划,

int robCore(vector<int> &nums,int start,int end){

        int size=end-start+1;

        if(start>end)//必须判断

            return 0;

        if(size==1)

            return nums[start];

            

       int a=nums[start];

       int b=max(nums[start],nums[start+1]);

       

       for(int i=start+2;i<=end;++i){

           int temp=b;

           b=max(a+nums[i],b);

           a=temp;

       }

       return b;

    }

    int rob(vector<int>& nums) {

        int size=nums.size();

        if(size==0)

            return 0;

        if(size==1)

            return nums[0];

        int robed= nums[0]+robCore(nums,2,size-2);//注意,这里默认保证 end>=start

        int nonrobed=robCore(nums,1,size-1);

        return max(robed,nonrobed);

    }


以上是关于213. House Robber II的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 213. House Robber II

213. House Robber II

213. House Robber II

213. House Robber II

213. House Robber II

leetcode No213. House Robber II