213. 打家劫舍 II

这篇具有很好参考价值的文章主要介绍了213. 打家劫舍 II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于此题我的往期文章,动规五部曲详解篇

leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133409962213. 打家劫舍 II - 力扣(LeetCode)


你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。

给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额


213. 打家劫舍 II,c++

213. 打家劫舍 II,c++


>>左闭右闭

(1)回溯 198. 打家劫舍 - 力扣(LeetCode)

class Solution {
public:
    int rob(vector<int>& nums) {
        int n = nums.size();
        function<int(int)>dfs = [&](int i) -> int {
            if(i<0) return 0;
            return max(dfs(i-1),dfs(i-2)+nums[i]);
        };
        return dfs(n-1);
    }
};
  • 超时!!! 

(2)递归搜索 + 保存计算结果 = 记忆化搜索

class Solution {
public:
    // 记忆化递归
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> memo(n,-1);
        function<int(int)>dfs = [&](int i) -> int {
            if(i<0) return 0;
            int& res = memo[i];
            if(res != -1) return res;
            return res=max(dfs(i-1),dfs(i-2)+nums[i]);
        };
        return dfs(n-1);
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        // int n=end-start+1;
        // vector<int> memo(n+1,-1);
        vector<int> memo(end+1,-1);
        function<int(int)>dfs = [&](int i) -> int {
            if(i<start) return 0;
            int& res = memo[i];
            if(res != -1) return res;
            return res=max(dfs(i-1),dfs(i-2)+nums[i]);
        };
        return dfs(end);
    }

    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};

(3)1:1 翻译成递推

  • ① 1:1 翻译成递推:213. 打家劫舍 II,c++
class Solution {
public:
    // 1:1 翻译成递推:f[i] = max(f[i-1],f[i-2]+nums[i]);
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n,0);
        if(nums.size()==0) return 0;
        if(nums.size()==1) return nums[0];
        f[0]=nums[0];
        f[1]=max(nums[0],nums[1]);
        for(int i=2;i<n;i++) 
            f[i] = max(f[i-1],f[i-2]+nums[i]);
        return f[n-1];
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        if(end == start) return nums[start];
        // int n = nums.size();
        int n = end+1;
        vector<int> f(n,0);
        f[start]=nums[start];
        f[start+1]=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++) 
            f[i] = max(f[i-1],f[i-2]+nums[i]);
        return f[end];
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};
  • ② 1:1 翻译成递推:213. 打家劫舍 II,c++
class Solution {
public:
    // 1:1 翻译成递推:f[i+2] = max(f[i+1],f[i]+nums[i]);
    int rob(vector<int>& nums) {
        int n = nums.size();
        vector<int> f(n+2,0);
        for(int i=0;i<n;i++) 
            f[i+2] = max(f[i+1],f[i]+nums[i]);
        return f[n+1];
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    /*
    int robRange(vector<int>& nums,int start,int end) {
        if(end == start) return nums[start];
        int n = nums.size();
        vector<int> f(n+2,0);
        for(int i=start;i<n;i++)  
            f[i+2] = max(f[i+1],f[i]+nums[i]);
        return f[end+2];
    }*/
    int robRange(vector<int>& nums,int start,int end) {
        // int n = nums.size();
        int n=end+1;
        vector<int> f(n+2,0);
        for(int i=start;i<=end;i++)  
            f[i+2] = max(f[i+1],f[i]+nums[i]);
        return f[end+2];
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};

(4)优化空间复杂度

  • 213. 打家劫舍 II,c++
  • 213. 打家劫舍 II,c++
class Solution {
public:
    // 空间优化
    int rob(vector<int>& nums) {
        int n = nums.size();
        if(n==0) return 0;
        if(n==1) return nums[0];
        int f0=nums[0];
        int f1=max(nums[0],nums[1]);
        for(int i=2;i<n;i++) {
            int new_f = max(f1,f0+nums[i]);
            f0=f1;
            f1=new_f;
        }
        return f1;
    }
};
  • 把 198.打家劫舍 的函数改成 robRange 
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        if(end == start) return nums[start];
        int f0=nums[start];
        int f1=max(nums[start],nums[start+1]);
        for(int i=start+2;i<=end;i++) {
            int new_f = max(f1,f0+nums[i]);
            f0=f1;
            f1=new_f;
        }
        return f1;
    }

    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};
  • 213. 打家劫舍 II,c++
  • 213. 打家劫舍 II,c++
class Solution {
public: 
    // 空间优化
    int rob(vector<int>& nums) {
        int n = nums.size();
        int f0=0,f1=0;
        for(const int& x:nums) {
            int new_f = max(f1, f0 + x);
            f0 = f1;
            f1 = new_f;
        }
        return f1;
    }
};
class Solution {
public:
    int robRange(vector<int>& nums,int start,int end) {
        int f0=0,f1=0;
        for(int i=start;i<=end;i++) {
            int new_f=max(f1,f0+nums[i]);
            f0=f1;
            f1=new_f;
        }
        return f1;
    }
    int rob(vector<int>& nums) {
        int n = nums.size();
        if (n == 0) return 0;
        if (n == 1) return nums[0];
        int result1 = robRange(nums, 0, n - 2); // 情况二
        int result2 = robRange(nums, 1, n - 1); // 情况三
        return max(result1, result2);
    }
};

我的往期文章推荐:

leetCode 213. 打家劫舍 II 动态规划 房间连成环怎么偷呢?_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://heheda.blog.csdn.net/article/details/133409962leetCode 198.打家劫舍 动态规划入门:从记忆化搜索到递推-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/134179583?spm=1001.2014.3001.5501leetCode 198.打家劫舍 动态规划 + 优化空间复杂度_呵呵哒( ̄▽ ̄)"的博客-CSDN博客https://blog.csdn.net/weixin_41987016/article/details/133390944?spm=1001.2014.3001.5501文章来源地址https://www.toymoban.com/news/detail-740277.html

到了这里,关于213. 打家劫舍 II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java 动态规划 Leetcode 213. 打家劫舍 II

    代码展示:         该题其实是Java 动态规划 面试题 17.16. 按摩师的变种,增加了一个首尾是相邻的条件,而我们解决该题也要用到链接的这道题的思想,可以先去看一下上面这篇博客 此题可以采用动态规划的方法进行解决,根据解决动态规划题目的5大步骤进行逐步分析

    2024年02月13日
    浏览(40)
  • LeetCode213.House-Robber-II<打家劫舍II>

      在版本一中增加了一个条件 那就是首尾相关联。那么只需要进行两次循环即可。 第一次是循环是偷第一家的 那么循环到n-1 截至 并且保存一个cmp 第二次循环是不偷第一家的 循环到n截至。然后比较cmp 与 dp [n] 的最大值即可。  

    2024年02月16日
    浏览(45)
  • 算法刷题Day 48 打家劫舍+打家劫舍II+打家劫舍III

    分成两段来处理:比如说输入的长度是n(0~n-1),就分成[0, n - 1)和[1, n)两部分 写一个辅助函数,返回两个状态,抢或者不抢能得到的最大收获。

    2024年02月16日
    浏览(36)
  • 【算法|动态规划No.10】leetcode LCR 089. 打家劫舍 & LCR 090. 打家劫舍 II

    个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助 🍓希望我们一起努力、成长,共同进步。

    2024年01月20日
    浏览(44)
  • 【学会动态规划】打家劫舍 II(12)

    目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 学习一个算法没有捷径,更何况是学习动态规划, 跟我一起刷动态规划算法题,一起学会动态规划! 题目链接:213. 打家劫舍 II - 力扣(Lee

    2024年02月15日
    浏览(41)
  • 每日一题之打家劫舍II

    题目链接 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统, 如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报

    2024年02月08日
    浏览(43)
  • 打家劫舍 II问题的动态规划解决方案及C++代码实现

    解决打家劫舍 II问题涉及动态规划,将环形问题转化为两个单排问题。通过状态转移方程和初始化,计算可以偷窃到的最高金额。C++代码实现包括状态显示、状态转移方程、初始化、填表顺序和返回值。

    2024年01月21日
    浏览(51)
  • Golang每日一练(leetDay0075) 打家劫舍II、最短回文串

    目录 213. 打家劫舍 II House Robber ii  🌟🌟 214. 最短回文串 Shortest Palindrome  🌟🌟🌟 🌟 每日一练刷题专栏 🌟 Rust每日一练 专栏 Golang每日一练 专栏 Python每日一练 专栏 C/C++每日一练 专栏 Java每日一练 专栏 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的

    2024年02月06日
    浏览(46)
  • 【动态规划】12简单多状态dp问题_打家劫舍II_C++ (medium)

    题目链接:leetcode打家劫舍II 目录 题目解析: 算法原理 1.状态表示 2.状态转移方程 3.初始化 4.填表顺序 5.返回值 编写代码 题目让我们求 在不触动警报装置的情况下  ,能够偷窃到的最高金额。 由题可得: 第一个房屋和最后一个房屋是紧挨着的 如果两间相邻的房屋在同一晚

    2024年02月02日
    浏览(48)
  • 【四】【C语言\动态规划】地下城游戏、按摩师、打家劫舍 II,三道题目深度解析

    动态规划就像是解决问题的一种策略,它可以帮助我们更高效地找到问题的解决方案。这个策略的核心思想就是将问题分解为一系列的小问题,并将每个小问题的解保存起来。这样,当我们需要解决原始问题的时候,我们就可以直接利用已经计算好的小问题的解,而不需要重

    2024年02月04日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包