Middle-题目58:213. House Robber II

题目原文:
Note: This is an extension of House Robber.

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.
题目大意:
Easy-题目26,但是现在房子围成了环形,仍然求最大利益。
题目分析:
分第一家是否偷讨论,如果偷第一家,那么最后一家不能偷,则退化成第一家到倒数第二家的线性问题,如果不偷第一家,那么相当于从第二家到最后一家的线性问题。
源码:(language:c)

int rob(int* nums, int numsSize) {
    if(numsSize==0)
        return 0;
    else if(numsSize==1)
        return nums[0];
    else if(numsSize==2)
        return nums[0]>nums[1]?nums[0]:nums[1];
    else
        return max(rob1(nums,numsSize-1),rob1(nums+1,numsSize-1));
}
int max(int a,int b) {
    return a>b?a:b;
}
int rob1(int* nums, int numsSize) {
    if(numsSize==0)
        return 0;
    if(numsSize==1)
        return nums[0];
    else if(numsSize==2)
        return nums[0]>nums[1]?nums[0]:nums[1];
    else
    {
        int i;
        int dp1,dp2,dp;

        dp1=nums[0];
        dp2=nums[0]>nums[1]?nums[0]:nums[1];
        for(i=2;i<numsSize;i++)
        {
            dp=dp2>dp1+nums[i]?dp2:dp1+nums[i];
            dp1=dp2;
            dp2=dp;
        }
        return dp;
    }
}

成绩:
1ms,众数100%
Cmershen的碎碎念:
一开始想到对环上每个节点遍历一次,后来发现只讨论第一个节点即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值