代码随想录算法训练营第40天|LeetCode 198.打家劫舍、213.打家劫舍II、337.打家劫舍III

news2024/11/17 23:39:33

1. LeetCode 198.打家劫舍

题目链接:https://leetcode.cn/problems/house-robber/
文章链接:https://programmercarl.com/0198.打家劫舍.html#算法公开课
视频链接:https://www.bilibili.com/video/BV1Te411N7SX

在这里插入图片描述

思路:
递推公式:
第j个房间偷还是不偷
偷:dp[j-2]+nums[i]
不偷:dp[j-1]
dp[j]=Math.max(dp[j-2]+nums[j],dp[j-1])

class Solution {
    public int rob(int[] nums) {
        
        if (nums.length==1) {
            return nums[0];
        }
        //1.定义dp数组 
        //dp[j]表示下标j以内的房间(包括j)所能偷窃的最大值
        int[] dp = new int[nums.length];
        //2.递推公式
        //第j个房间偷还是不偷
        //偷:dp[j-2]+nums[i]
        //不偷:dp[j-1]
        //dp[j]=Math.max(dp[j-2]+nums[j],dp[j-1])
        //3.初始化
        dp[0] = nums[0];
        dp[1] = Math.max(nums[0],nums[1]);
        //4.遍历顺序
        for (int j=2;j<nums.length;j++) {
            dp[j] = Math.max(dp[j-2]+nums[j],dp[j-1]);
        }

        return dp[nums.length-1];
    }
}

2. LeetCode 213.打家劫舍II

题目链接:https://leetcode.cn/problems/house-robber-ii/
文章链接:https://programmercarl.com/0213.打家劫舍II.html
视频链接:https://www.bilibili.com/video/BV1oM411B7xq

在这里插入图片描述

思路:
关键是如何理解环形。
对于一个数组,成环的话主要有如下三种情况:
情况一:不考虑首尾;
情况二:考虑首,不考虑尾;
情况三:考虑尾,不考虑首。
而情况二、情况三包含情况一。因此只需考虑情况二、情况三即可。

解法:
class Solution {
    public int rob(int[] nums) {
        if (nums.length==1) {
            return nums[0];
        }

        int head = process(nums,0,nums.length-2);
        int tail = process(nums,1,nums.length-1);

        return Math.max(head,tail);

    }
    public int process(int[] nums,int start,int end) {
        if (start == end) {
            return nums[start];
        }
        //1.定义dp数组 dp[i]表示i下标以内偷窃的最高金额
        int[] dp = new int[nums.length];
        //2.递推公式
        //dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i])
        //3.初始化
        dp[start] = nums[start];
        dp[start+1] = Math.max(nums[start],nums[start+1]);
        //4.遍历顺序
        for (int i=start+2;i<=end;i++) {
            dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i]);
        }
        return dp[end];
    }
}

3. LeetCode 337.打家劫舍III

题目链接:https://leetcode.cn/problems/house-robber-iii/
文章链接:https://programmercarl.com/0337.打家劫舍III.html#思路
视频链接:https://www.bilibili.com/video/BV1H24y1Q7sY

在这里插入图片描述

思路:
本题关键:后序遍历+返回值是一个二维数组,其中0索引值是当前节点偷的最大金额,1索引值是当前节点不偷的最大金额。注意:这里的最大金额,是以该节点为根节点的树的在不触发警报的前提下的最大金额和。
当前节点可以偷或者不偷;
若偷,则左右子节点就不能偷,获取左右节点的不偷的最大金额之和+本节点金额
若不偷,则左右子节点可以偷或者不偷,分别获取左右子节点偷或者不偷的最大金额之和。
由于是深度优先搜索遍历,且利用了左右子节点的返回值,则使用后序遍历。
返回值数组就是dp数组。

/**
 * 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[] res = process(root);
        return Math.max(res[0],res[1]);
    }

    public int[] process(TreeNode root) {
        // 终止条件
        if (root == null) return new int[]{0,0};
        // 左
        int[] left = process(root.left);
        // 右
        int[] right = process(root.right);
        // 中
        // 当前节点偷还是不偷
        // 偷
        int rob = left[1] + right[1] + root.val;
        // 不偷
        int norob = Math.max(left[0],left[1]) + Math.max(right[0],right[1]);
        return new int[]{rob,norob};
    }
}

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

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

相关文章

Profinet从站转TCP/IP协议转化网关(功能与配置)

如何将Profinet和TCP/IP网络连接通讯起来呢?近来几天有几个朋友问到这个问题&#xff0c;那么作者在这里统一说明一下。其实有一个不错的设备产品可以很轻易地解决这个问题&#xff0c;名为JM-DNT-PN。接下来作者就从该设备的功能及配置详细说明一下。 一&#xff0c;设备主要…

相机镜头移动特效视频转场模板Pr工程文件

Pr转场模板&#xff0c;相机镜头移动特效视频转场Pr工程文件 逼真的相机移动&#xff1a;具有一系列动态相机移动功能&#xff0c;包括平移、倾斜、缩放和旋转&#xff0c;为您的过渡添加逼真和引人入胜的视觉元素。 无缝集成&#xff1a;以.prproj文件形式提供&#xff0c;便…

操作系统——进程深度理解

目录 一、操作系统 1、概念 2、操作系统的结构 3、操作系统的理解 二、进程 一、操作系统 1、概念 操作系统是一个软件&#xff0c;一款进行软硬件资源管理的软件 电脑开机的时间&#xff0c;就是把操作系统加载到内存并运行的过程。 对操作系统广义的认识&#xff1a;…

PowerBI 度量值不被切片器筛选

我们有这样一张表&#xff1a; 我们用一个切片器绑定奖金表[奖金]&#xff0c;就可以用表格来联动显示数据: 现在用户有个新的需求&#xff0c;当单选某个奖金时&#xff0c;需要统计小于这个奖金数的人数。 我用了一个度量值来统计&#xff1a; 度量值 VAR selected_bonus…

全国区块链职业技能大赛样题第9套后端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 项目预览 登录 用户管理

vue3 快速入门 (五) : Flex布局

1. 如何变成Flex布局 变成Flex容器&#xff0c;只需在容器布局的节点的CSS中&#xff0c;增加display : flex .mylayout {/* 省略了其他代码 */display: flex; }2. flex direction : 方向 row : 以行排列 row-reverse &#xff1a; 以行反向排列 column &#xff1a;以列排列…

向日葵RCE复现(CNVD-2022-10270/CNVD-2022-03672)

一、环境 1.1 网上下载低版本的向日葵<2022 二、开始复现 2.1 在目标主机上打开旧版向日葵 2.2 首先打开nmap扫描向日葵主机端口 2.3 在浏览器中访问ip端口号cgi-bin/rpc?actionverify-haras &#xff08;端口号&#xff1a;每一个都尝试&#xff0c;直到获取到session值…

AJAX之原理

目录 XMLHttpRequest基本使用查询参数数据提交&#xff08;注册账号&#xff09; Promise基本语法Promise三种状态Promise链式调用 async函数和await XMLHttpRequest 基本使用 XMLHttpRequest对象用于与服务器交互 与axios关系&#xff1a;axios内部采用XMLHttpRequest与服务…

Elasticsearch:跨集群使用 ES|QL

警告&#xff1a;ES|QL 的跨集群搜索目前处于技术预览阶段&#xff0c;可能会在未来版本中更改或删除。Elastic 将努力解决任何问题&#xff0c;但技术预览中的功能不受官方 GA 功能的支持 SLA 约束。 使用 ES|QL&#xff0c;你可以跨多个集群执行单个查询。 前提&#xff1a; …

每天一个设计模式之命令模式(第二天)

交互模式中的命令模式&#xff0c;在开始记录之前&#xff0c;要讲些自己的感受&#xff0c;真真切切的感受到了悟性的瓶颈&#xff01;一共十页书&#xff0c;需要自己细细琢磨品味&#xff0c;至少三四遍才大概了解了他们间的逻辑&#xff0c;我需要调整下自己的学习思路&…

Lumos学习王佩丰Excel第七讲:认识公式与函数

一、认识Excel公式 1、运算符 运算符 作用 算术运算符 加 - 减 * 乘 / 除 % 百分比&#xff0c;相当于除以100 & 连接符&#xff0c;文本数字均可连接 ^ 乘方 比较运算符 等于 > 大于 < 小于 ≤ 小于等于 ≥ 大于等于 例1&#xff1…

python实现信号合成(DSP仿真系统)【1】

python实现信号合成(DSP仿真系统)【1】 1、效果图 2、功能结构 1、基础信号正弦波、脉冲函数、阶跃函数、斜坡函数、方波、sinc曲线、矩形波(非周期) 2、信号合成(叠加)叠加噪音 3、波形展示原始波形、叠加波形、FFT、PSD、卷积 4、各种滤波器4.1.限幅滤波器4.2.中位值滤…

【OSCP系列】OSCP靶机-BTRsys-2.1(原创)

OSCP系列靶机—BTRsys-2.1 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、主机发现 二、端口扫描 1、快速扫描 2、全端口扫描 3、服务系统探测 4、漏洞探测 80端口扫到了一些目录&#xff0c;有wordpress框…

CentOS7使用yum安装MySQL

废话不多说&#xff0c;直接上干货 1、CentOS7的yum源中默认是没有mysql的&#xff0c;我们先下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 2、安装mysql-community-release-el7-5.noarch.rpm包 sudo rpm -ivh mysql-community-r…

算法通关:007时间复杂度和空间复杂度:生成相邻两数不相等的数组

生成相邻两数不相等的数组 全部代码&#xff1a; import java.util.Arrays;/*** Author: ggdpzhk* CreateTime: 2024-07-28* 随机生成数组&#xff0c;比如每个元素都在0-3之间&#xff0c;且相邻两个元素不相同*/ public class _007 {public static void main(String[] args)…

Redis:管道

1. 面试题 如何优化频繁命令往返造成的性能瓶颈&#xff1f; 问题由来 edis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。一个请求会遵循以下步骤&#xff1a; 1 客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果)&#xff0c;并监听Socket…

Vue.js 2 项目实战(九):商品列表

前言 Vue.js 是一个用于构建用户界面的渐进式 JavaScript 框架。它的设计初衷是通过采用简洁且强大的结构&#xff0c;使前端开发变得更简单和高效。以下是对 Vue.js 的详细介绍&#xff1a; 核心特性 声明式渲染 Vue.js 使用声明式语法来描述用户界面&#xff0c;通过数据绑…

力扣刷题----42. 接雨水

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图&#xf…

经验分享:大数据信用报告可以查到什么?哪里能查大数据?

相信不少人都因为大数据信用不良碰过壁&#xff0c;这时候不少人反过来想要了解大数据信用报告可以查到什么?哪里能查大数据?其实大数据信用报告就是通过对个人在互联网上产生的各类行为数据收集、整合和分析&#xff0c;并基于此对个人信用状况进行评估和预测的一种检测工具…

Java之快速排序

快速排序 快速排序(Quick Sort)算法&#xff0c;简称快排&#xff0c;利用的是分治的思想。 快速排序思路&#xff1a; ​ 如果要对 first->end 之间的数列进行排序&#xff0c;我们选择 first->end 之间的任意一个元素数据作为分区点(轴值Pivot)&#xff0c;然后遍历 f…