My Eighty-second Page - 打家劫舍Ⅱ - By Nicolas

这篇page是针对leetcode上的213.打家劫舍Ⅱ所写的。小尼先简单的说明一下这道题的意思,就是我们还是以小偷的身份去进行偷窃,我们这一次我们给出的房间的第一间和最后一间是连在一起构成一个环形的结构,同样我们每一个房间里面都有对应的金额可以进行对应的偷取,我们需要求的就是我们在不报警的条件下求出我们可以偷窃的最大的金额(其中触发报警的条件跟打家劫舍一样,就是我们如果晚上偷窃了连续的两个房间,就会触发报警)

小尼先简单的分析一下这道题的思路,其实这都题的思路还是比较简单的,其实我们可以细细的分析,我们为了避免环结构对我们的困扰,我们分成了三种情况,第一种就是我们只考虑不包含首尾元素的情况;第二种就是我们考虑包含首元素,不包含尾部元素的情况;第三种就是我们考虑包含尾元素,不包含首元素的情况。我们分析了之后也可以知道,我们的第一种情况其实就是包含了我们的第二种第三种情况/

小尼接下来拉一下这道题的解题的代码:

class Solution {
    public int rob(int[] nums) {
        if (nums == null || nums.length == 0)
            return 0;
        int len = nums.length;
        if (len == 1)
            return nums[0];
        return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));
    }

    int robAction(int[] nums, int start, int end) {
        int x = 0, y = 0, z = 0;
        for (int i = start; i < end; i++) {
            y = z;
            z = Math.max(y, x + nums[i]);
            x = y;
        }
        return z;
    }
}

其实这道题的解法也是有巧妙之处,我们先排除了特殊的情况,然后我们在开始做了判断,我们求出了两种情况下的二值再取两者中的最大值,我们在取值的for循环中,其中有一点运用的非常巧妙,我们这里定义了x,y,z三个值,这三个值小尼一一跟大家说明一下它们的作用以及记录的是哪些值,x永远记录的都是最前面的值,我们的i在不断往后遍历取nums[i]的时候,我们的x都是与i取到的nums[i]相隔一个位置的距离,这样我们的x+nums[i]才可以表示我们偷取了之后的值,然后y记录的一直都是x之后,nums[i]之前的那个值,我们在其中z表示最后的结果,比较的就是其中y与x+nums[i]的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值