力扣爆刷第77天--动态规划一网打尽打家劫舍问题

这篇具有很好参考价值的文章主要介绍了力扣爆刷第77天--动态规划一网打尽打家劫舍问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

力扣爆刷第77天–动态规划一网打尽打家劫舍问题

一、198.打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/
思路:小偷不能连续两家偷,由此可以定义dp[i]表示,小偷经过[0,i]所能获取到的最大金额,那么我们可以得到递推公式:
dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
即如果偷nums[i]家就不能偷前一家,为dp[i-2]+nums[i],如果不偷当前这家,那金额就要维持为经过前一家时的结果。
很简单的题目,标准的动态规划,进行状态选择。
标准写法

class Solution {
   public int rob(int[] nums) {
       if(nums.length == 1) return nums[0];
       int[] dp = new int[nums.length];
       dp[0] = nums[0];
       dp[1] = Math.max(nums[0], nums[1]);
       for(int i = 2; i < nums.length; i++) {
           dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
       }
       return dp[nums.length-1];
    }
}

优化写法

class Solution {
   public int rob(int[] nums) {
       if (nums.length == 1) return nums[0];
        
        int a = nums[0], b= Math.max(nums[0], nums[1]);
        for (int i = 2; i < nums.length; i++) {
            int c = Math.max(b, a+nums[i]);
            a = b;
            b = c;
        }
        return b;
    }
}

二、213.打家劫舍II

题目链接:https://leetcode.cn/problems/house-robber-ii/
思路:本题和上一题不同之处是房间首尾相连,那么也很简单,直接从两个范围求,第一个范围[0, len-1], 第二个范围[1, len],分别从这两个范围,一个只含头,一个只含尾,其他的和上一题一样。

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

    int getMax(int[] nums, int s, int e) {
        int[] dp = new int[nums.length];
        dp[s] = nums[s];
        dp[s+1] = Math.max(nums[s], nums[s+1]);
        for(int i = s+2; i < e; i++) {
            dp[i] = Math.max(dp[i-1], dp[i-2]+nums[i]);
        }
        return dp[e-1];
    }
}

三、337.打家劫舍 III

题目链接:https://leetcode.cn/problems/house-robber-iii/description/
思路:二叉树形态的打家劫舍,其实也很简单,每个节点有两种状态分别是抢不与抢,后序遍历返回dp数组,有了左右子树的dp数组即可计算当前节点的dp数组,计算后返回,以此递归即可解题。文章来源地址https://www.toymoban.com/news/detail-836852.html

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
   public int rob(TreeNode root) {
       int[] dp = traverse(root);
       return Math.max(dp[0], dp[1]);
    }
    // 0 偷 1 不偷
    int[] traverse(TreeNode root) {
        if(root == null) return new int[2];
        int[] left = traverse(root.left);
        int[] right = traverse(root.right);
        int[] dp = new int[2];
        dp[0] = root.val + left[1] + right[1];
        dp[1] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        return dp;      
    }
    
}

到了这里,关于力扣爆刷第77天--动态规划一网打尽打家劫舍问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【Selenium】一网打尽 小窗口滑动 & 全窗口滑动

    收到小伙伴私信,如果web页面中含有小页面,该怎样使用Selenium去滑动小页面,这里总结记录一下。 都是JavaScript的知识~~ 方法 释义 window.scrollBy(x,y) 滑动指定的x和y的距离 document.body.scrollHeight 元素内容高度的度量 document.querySelector() 根据指定选择器查找元素 getElementById() 根据

    2024年02月06日
    浏览(42)
  • GitLab入门指南:上传与下载操作一网打尽

    GitLab是一个基于Git的开源仓库管理系统,提供了一个Web界面的Git存储库管理器,并集成了多种开发工具的功能,如代码审查、问题跟踪、持续集成和持续部署等。GitLab可以在本地服务器上部署,也可以使用其提供的云服务。它广泛应用于软件开发团队,帮助团队成员协作开发

    2024年01月25日
    浏览(52)
  • 一网打尽java注解-克隆-面向对象设计原则-设计模式

    注解 :也叫标注,用于包、类、变量、方法、参数上。可以通过反射获取标注。可以在编译期间使用,也可以被编译到字节码文件中,运行时生效。 内置注解 :Java语言已经定义好的注解。 @Overread :用于方法重写。 @Deprecated :标记过时方法。 @SuppressWarnings :指示编译器去

    2024年02月11日
    浏览(47)
  • C++回调函数精解:基础使用和高级技巧一网打尽

      概述: C++回调函数提供了灵活的编程方式。基础使用演示了如何定义和调用简单的回调,而高级使用则展示了返回值非 `void` 的回调和Lambda表达式的灵活性。这种机制使程序更模块化、可维护。 在C++中,回调函数可以用于实现基础和高级的功能。以下是一个包含基础和高级

    2024年03月18日
    浏览(55)
  • Java HttpClient 实战 GET 与 POST 请求一网打尽

    在Java中, HttpClient 是进行HTTP通信的一个强大工具。它提供了简单而灵活的API,可以轻松地发送HTTP请求并处理响应。在本篇博文中,我们将深入探讨如何使用 HttpClient 执行GET、POST等不同类型的HTTP请求。 首先,确保在项目的 pom.xml 文件中引入 HttpClient 的依赖: 让我们从一个简

    2024年01月17日
    浏览(46)
  • MQTT 持久会话 vs. Clean Session内幕一网打尽

    不稳定的网络 有限的硬件资源 物联网应用两大难题,MQTT 客户端与服务器的连接可能随时因网络波动及资源限制而异常断开。为解决网络连接断开对通信造成的影响,MQTT 协议提供持久会话功能。 MQTT 客户端在发起到服务器的连接时,可设置是否创建一个持久会话。持久会话

    2024年02月03日
    浏览(47)
  • Python虚拟环境(pipenv、venv、conda一网打尽)[通俗易懂]

    1. 什么是Python环境 要搞清楚什么是虚拟环境,首先要清楚Python的环境指的是什么。当我们在执行python test.py时,思考如下问题: python哪里来?这个主要归功于配置的系统环境变量 PATH ,当我们在命令行中运行程序时,系统会根据 PATH 配置的路径列表依次查寻是否有可执行文件

    2024年02月08日
    浏览(45)
  • Java面试、进阶、实践一网打尽(由电子工业出版社出版)

    准备好应对Java开发的新挑战吗?我们为您精选了五本核心书籍,一站式满足您在Java面试准备、技能进阶和实战应用的需求。 这套书籍包括《Offer来了:Java面试核心知识点精讲(第2版)》、《Java面试八股文:高频面试题与求职攻略一本通》、《Spring Boot编程思想(核心卷)》

    2024年02月04日
    浏览(51)
  • Git新手?这篇文章带你飞!基础操作一网打尽!

    智能化校园:深入探讨云端管理系统设计与实现(一) 智能化校园:深入探讨云端管理系统设计与实现(二) Git(读音为/gɪt/) 是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。 git是世界上最先进的分布式版本控制系统(没有之一)

    2024年01月17日
    浏览(43)
  • Rust 全面指南:从基础到高级,一网打尽 Rust 的编程知识

    因为在学习Rust过程中,因为代码量不是太多,所以有一些学完就忘了,特此记录一些Rust知识点 Rust是什么? Rust是一种现代的、强类型的、系统级编程语言。它被设计用于编写高性能、并发、安全的系统,并且可以避免常见的内存安全问题,如空指针和数据竞争。Rust的特点包

    2024年02月08日
    浏览(50)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包