【Leetcode】DP | 打家劫舍,当一个机灵的小偷

news2024/12/23 17:37:12

198 打家劫舍

D [ i ] D[i] D[i]表示前 i i i间房子的最大收益:
D [ i ] = max ⁡ ( D [ i − 1 ] , D [ i − 2 ] + n u m s [ i ] ) D [ 0 ] = n u m s [ 0 ] D [ 1 ] = max ⁡ ( n u m s [ 0 ] , n u m s [ 1 ] ) D[i] = \max(D[i -1], D[i-2]+nums[i]) \\ D[0] = nums[0] \\ D[1] = \max(nums[0], nums[1]) D[i]=max(D[i1],D[i2]+nums[i])D[0]=nums[0]D[1]=max(nums[0],nums[1])

213 打家劫舍Ⅱ

围成一圈,能偷盗的最高金额。

  • 情况1:不偷0、偷n-1
  • 情况2:不偷n-1、偷0
  • 情况3:既不偷0,也不偷n-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vmFZowPL-1686383959559)(【Leetcode】DP-打家劫舍,当一个机灵的小偷/image-20230610144102013.png)]

如何保证第一间房屋和最后一间房屋不同时偷窃呢?如果偷窃了第一间房屋,则不能偷窃最后一间房屋,因此偷窃房屋的范围是第一间房屋到最后第二间房屋;如果偷窃了最后一间房屋,则不能偷窃第一间房屋,因此偷窃房屋的范围是第二间房屋到最后一间房屋。

即取下面二者中的较大值。显然这两个式子在情况3是有重复的,但无所谓,只要覆盖了情况3就好,就可以求出最大值。
rob ( n u m s [ 0 , n − 2 ] ) ⇒  case2 + case3 rob ( n u m s [ 1 , n − 1 ] ) ⇒  case1 + case3 \text{rob}(nums[0,n-2])\Rightarrow \text{ case2 + case3} \\ \text{rob}(nums[1,n-1])\Rightarrow \text{ case1 + case3} rob(nums[0,n2]) case2 + case3rob(nums[1,n1]) case1 + case3

class Solution {
    public int rob(int[] nums, int l, int r) {
        // 偷盗nums[l,r]范围
        if (l > r) {
            return 0;
        }
        if (l == r) {
            return nums[l];
        }
        int[] D = new int[r - l + 1];
        D[0] = nums[l];
        D[1] = Math.max(nums[l], nums[l + 1]);

        for (int i = 2; i < r - l + 1; i++) {
            D[i] = Math.max(D[i - 1], D[i - 2] + nums[l + i]);
        }

        return D[r - l];
    }

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

337 打家劫舍Ⅲ★

树,能偷盗的最高金额。

int rob(TreeNode root):

【一个节点具有两个属性值:(1)抢劫该节点能够得到的最大收益、(2)不抢劫该节点能得到的最大收益】

  1. 抢劫该节点,则不能抢劫两个孩子节点
  2. 不抢劫该节点,可以抢劫两个孩子节点,也可以不抢劫两个孩子节点,取其中更大的

class Solution {
    public int rob(TreeNode root) {
        int[] money = robOrNot(root);
        return Math.max(money[0], money[1]);
    }

    public int[] robOrNot(TreeNode root) {
        if (root == null) {
            return new int[]{0, 0};
        }

        int[] money = new int[2];
        int[] left = robOrNot(root.left);
        int[] right = robOrNot(root.right);

        // 不抢劫该节点
        money[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        // 抢劫该节点
        money[1] = left[0] + right[0] + root.val;

        return money;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试工程师如何从功能测试转成自动化测试?

功能测试转成自动化测试&#xff0c;答案就三个字&#xff1a;“靠学习”。 学习自动化的方法无非是三种&#xff1a; 一、靠培训&#xff08;下方有如何选择培训机构&#xff09; 在相对有氛围的学习环境中来学习自动化测试&#xff0c;这是一个较快学习的方法。二、靠自学自…

js文件引入vue $notify组件,自定义添加按钮功能!

import Vue from vue; //新创建一个vue实例 let v new Vue(); const h v.$createElement console.log(h) v.$notify({ dangerouslyUseHTMLString: true, message: h( div, {}, [ h(p, {}, [ h(p, {style:"font-size: 15px;"}, 车架号&#xff1a;${res.rows[0].…

C# Winform 多个程序之间的通信(非Scoket)

效果 功能&#xff1a;打开窗体自动连接主程序&#xff0c;并自动添加到列表&#xff0c;可以向子程序群发消息 可以向单个程序单独发送消息 在退出程序后&#xff0c;添加的程序列表会自动移除 一、概述 参考&#xff1a;C# Winfrom程序之间通讯_c# sendmessege copydatastr…

x宝评论抓取

#某宝评论接口sign参数逆向 1.接口速览 多次请求发现&#xff0c;t为时间戳&#xff0c;sign为加密参数&#xff0c;盲猜和data、t有关&#xff0c;sign为32位&#xff0c;盲猜是字符串的32位的MD5 2.搜索js代码 这里为搜索的是appKey&#xff0c;就找到了sign&#xff0c;然…

如何实现APP自动化测试?

APP测试&#xff0c;尤其是APP的自动化测试&#xff0c;在软件测试工程师的面试中越来越会被问到了。为了更好的回答这个问题&#xff0c;我今天就给大家分享一下&#xff0c;如何进行APP的自动化测试。 一、为了实现JavaAppiumJunit技术用于APP自动化测试&#xff0c;所以需要…

使用AIGC工具提升论文阅读效率

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

接口测试实战工具如何选择?这6个工具首选(建议收藏)

常见接口类型 • HTTP/HTTPS 类型接口 基于HTTP协议开发的接口现在应用是最为广泛的&#xff0c;这类API使用起来简单明了&#xff0c;因为它是轻量级的、跨平台、跨语言的&#xff0c; 但凡是第三方提供的API都会有HTTP版本的接口。 RESTful API也是基于HTTP协议的&#xff0c…

Android滴滴路由框架DRouter原理解析

作者&#xff1a;linversion 前言 最近的一个新项目使用了Clean Architecture模块化MVVM架构&#xff0c;将首页每个tab对应的功能都放到单独的模块且不相互依赖&#xff0c;这时就有了模块间页面跳转的问题&#xff0c;经过一番研究选择了滴滴的DRouter&#xff0c;因为其出色…

Image captioning中自定义文本数据整理为类似Flickr8k.token.txt的格式--->助力后期生成JSON格式用于训练

手把手实现Image captioning,将自定义文本数据整理为类似Flickr8k.token.txt的格式,助力后期生成JSON格式用于训练。如果感觉有用,不妨给博主来个一键三连,白天科研,晚上肝文,实属不易~ ~ ](https://imgse.com/i/p9FmMDK) 这里写目录标题 1. 任务需求2. 程序实现2.1 读取…

vistual studio 2017中导入pthread.h的配置方法

1.下载pthread.h的相关库文件 下载路径 https://www.mirrorservice.org/sites/sourceware.org/pub/pthreads-win32/pthreads-w32-2-9-1-release.zip 加压后得到两种系统版本的三个文件夹 pthreads.2 : 包含了pthread的源文件 Pre-built2 :包含了pthreads for win32的头文件…

软件测试04:软件测试流程和软件测试过程

软件测试04&#xff1a;软件测试流程和软件测试过程 软件测试流程 软件测试流程&#xff1a;获取测试需求->编写测试计划->制造测试方案->开发与设计测试用例->执行测试->提交缺陷报告->测试分析与评审->提交测试总结->准备下一版本测试 软件测试过…

网页JS自动化脚本(九)创建一键导出数据库到桌面的功能按钮

我们获取到了数据库,当然我们希望能把这个数据库给保存到本地电脑上进行一些数据的处理,我们这一节就添加一个按钮把数据一次性导出 保存到桌面为json格式 我们直接用TXT打开它如下图所示 然后再使用json转EXCEL的小工具规整之后如下图 好了我们下面上代码 // UserScript // n…

算法提高-图论-单源最短路的综合应用

单源最短路的综合应用 单源最短路的综合应用AcWing 1135. 新年好AcWing 340. 通信线路AcWing 342. 道路与航线AcWing 341. 最优贸易 单源最短路的综合应用 AcWing 1135. 新年好 多次dijkstra求每个点到其它点的最短距离&#xff0c; 此时相当于建好了一张图&#xff0c;每个点…

http客户端Fegin

1.RestTemplate方式调用存在的问题 代码可读性差&#xff0c;编程体验不统一 参数复杂URL难以维护 2.Feign的介绍 Feign是声明式的http客户端&#xff08;只需要将发http请求的信息写出即可&#xff09; 主要基于SpringMvc的注解来声明远程调用的信息&#xff1a; 步骤&…

(十二)K8S可视化工具Rancher部署项目应用实战

1.Rancher部署springboot私有镜像 连接私有镜像操作步骤 1.进入资源>>密文 2.进入镜像库凭证列表&#xff0c;点击添加凭证 3.输入凭证名称&#xff0c;选择自定义&#xff0c;填入自己的私有镜像仓库地址&#xff0c;这里使用的是阿里云&#xff0c;输入用户名和密码…

Zoho CRM SDK

前言 因早期公司的业务在Zoho CRM&#xff0c;现在孵化出自己的想法&#xff0c;想着能把一部分CRM的数据同步导出来&#xff0c;故研究Zoho CRM SDK的接入方法。虽说在文档上都有提及&#xff0c;但有部分细节不甚明了&#xff0c;也是一遍遍尝试出来的&#xff0c;所以分享出…

【Vue】六:路由(上)使用路由 多级路由

文章目录 1.多页面应用2. 单页面应用&#xff08;使用路由&#xff09;3. 多级路由 1.多页面应用 2. 单页面应用&#xff08;使用路由&#xff09; &#xff08;1&#xff09;安装vue-router插件 vue2 要安装 vue-router3 npm i vue-router3vu3 要安装 vue-router4 npm i vue…

字节薪酬体系被曝光,我真的酸了....

曾经的互联网是PC的时代&#xff0c;随着智能手机的普及&#xff0c;移动互联网开始飞速崛起。而字节跳动抓住了这波机遇&#xff0c;2015年&#xff0c;字节跳动全面加码短视频&#xff0c;从那以后&#xff0c;抖音成为了字节跳动用户、收入和估值的最大增长引擎。 自从字节…

【Java】数组详解

文章目录 一、数组的基本认识1.1 数组的概念1.2数组的创建与初始化1.3 数组的使用 二、数组的类型 — 引用类型2.1 JVM 内存分布2.2 什么是引用类型2.3 基本类型变量与引用类型变量的区别2.4 Java 中的 null 三、数组的应用3.1 保存数据3.2 函数参数3.3 函数返回值 一、数组的基…

STL——string和vector容器

初识STL **STL的基本概念****vector容器存放内置数据类型****在vector容器中存放自定义数据类型****vector容器嵌套vector容器****string容器——构造函数****string容器——赋值操作****string容器——字符串拼接****string容器——字符串的查找和替换****string容器——字符串…