• 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]的值

  • 相关阅读:
    博客摘录「 vue中调接口的方式:this.$api、直接调用、axios」2023年11月14日
    python+django+vue+Elementui人力资源管理系统
    【Linux】:体系结构与进程概念
    从零开始,开发一个 Web Office 套件(14):复制、粘贴、剪切、全选
    Unity ECS实例:制作俯视角射击游戏!
    通关剑指 Offer——剑指 Offer II 031. 最近最少使用缓存
    nodejs处理图片的几种方法,使用sharp,jimp,webconvert
    clang llc llvm-link llvm-config 应用示例
    面对有挑战的事情
    QT基础 柱状图
  • 原文地址:https://blog.csdn.net/weixin_51658729/article/details/128081157