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


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

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

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

    1. class Solution {
    2. public int rob(int[] nums) {
    3. if (nums == null || nums.length == 0)
    4. return 0;
    5. int len = nums.length;
    6. if (len == 1)
    7. return nums[0];
    8. return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));
    9. }
    10. int robAction(int[] nums, int start, int end) {
    11. int x = 0, y = 0, z = 0;
    12. for (int i = start; i < end; i++) {
    13. y = z;
    14. z = Math.max(y, x + nums[i]);
    15. x = y;
    16. }
    17. return z;
    18. }
    19. }

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

  • 相关阅读:
    【全开源】简单商城系统源码(PC/UniAPP)
    python基础:判断分支语句的数学运用
    中职计算机应用专业(云计算方向)建设实践
    Python与正则表达式
    传奇世界单机架设
    idea创建同级项目-纠结是SB
    React@16.x(14)context 举例 - Form 表单
    详解MySQL的MVCC(ReadView部分解析C++源码)
    【Redis】Redis 通用命令、键的过期策略
    和想象中完全不一样?巡课在线就能进行
  • 原文地址:https://blog.csdn.net/weixin_51658729/article/details/128081157