day81【leetcode】打家劫舍专题

news2024/11/16 23:55:31

文章目录

  • 前言
  • 一、打家劫舍(力扣198)【相邻两间房不能偷】
  • 二、打家劫舍 II(力扣213)【围成一圈 相邻两间房不能偷】
  • 三、打家劫舍 III(力扣337)【树形DP】
  • 每日一题day81:链表中的下一个更大节点(力扣1019)


前言

1、打家劫舍
2、打家劫舍Ⅱ
3、打家劫舍Ⅲ
4、链表中的下一个更大节点


一、打家劫舍(力扣198)【相邻两间房不能偷】

在这里插入图片描述
分析:

注意:dp[i]表示第i间房时,此时已经偷到的最大金额
每一间房都有偷和不偷两种情况
偷:需要确保不触发警报 dp[i-2]+nums[i]
不偷:dp[i-1];
dp[i] = Math.max(dp[i-2]+nums[i], dp[i-1]);

class Solution {
    public int rob(int[] nums) {
        int[]dp = new int[nums.length];
        if(nums.length ==1){
            return nums[0];
        }
        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-2]+nums[i],dp[i-1]);
        }
        return dp[nums.length-1];
    }
}

二、打家劫舍 II(力扣213)【围成一圈 相邻两间房不能偷】

在这里插入图片描述
分析:
分为左右两个部分 例如 1,2,3
可以分为左边:1,2;
右边:2,3;
对于左右两边分别进行1的操作,最后求最大值即可。

为什么要分两边: 原因在于首尾相连,如果包含首元素,不管偷不偷首元素,都不能包含尾元素。
同理 如果包含尾元素,不管偷不偷尾元素,都不能包含首元素。

需要额外处理 nums.length==2时的情况,因为不会执行右半部分,所以直接返回前两个元素的较大值即可

		if(nums.length==2){
            return Math.max(nums[0],nums[1]);
        }
class Solution {
public int rob(int[] nums) {
        if(nums.length==1){
            return nums[0];
        }
        int[] dp = new int[nums.length];
        int[] dp2 = new int[nums.length];
        dp[0] = nums[0];
        if(nums.length==2){
            return Math.max(nums[0],nums[1]);
        }
        dp[1] = Math.max(nums[0],nums[1]);
        //分为左右两个部分
        //左半部分
        for(int i=2;i<nums.length-1;i++){
            dp[i] = Math.max(dp[i-2]+nums[i],dp[i-1]);
        }
        //右半部分
        dp2[1] = nums[1];
        dp2[2] = Math.max(nums[1],nums[2]);
        for(int j=3;j<nums.length;j++){
            dp2[j] = Math.max(dp2[j-2]+nums[j],dp2[j-1]);
        }
        return Math.max(dp[nums.length-2],dp2[nums.length-1]);
    }
}

三、打家劫舍 III(力扣337)【树形DP】

在这里插入图片描述
在这里插入图片描述
分析:
注意选清楚二叉树的遍历方式,
其次,dp[]数组只需要记录当前结点偷与不偷的两个状态
dp[]数组不需要记录是哪一个结点,交给递归去做

注意:当不偷根节点时,左右结点不是必须要偷,左右结点也可以不偷,取决于左右节点偷的值大还是不偷的值大。

        //偷根节点
        val[0] = current.val+left[1]+right[1];
        //不偷根节点
        val[1] = Math.max(left[0],left[1])+Math.max(right[0],right[1]);
/**
 * 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 = new int[2];
        res = robTree(root);
        return Math.max(res[0],res[1]);
    }
    public  int[] robTree(TreeNode current){
        int[] val = new int[2];
        if(current == null) return val;
        int[] left = new int[2];
        int[] right = new int[2];
        left = robTree(current.left);
        right = robTree(current.right);

        //偷根节点
        val[0] = current.val+left[1]+right[1];
        //不偷根节点
        val[1] = Math.max(left[0],left[1])+Math.max(right[0],right[1]);
        return val;
    }
}

每日一题day81:链表中的下一个更大节点(力扣1019)

在这里插入图片描述

分析:
典型单调栈

public static int[] nextLargerNodes(ListNode head) {
            //单调栈?

            //求链表长度
            if(head == null) return null;
            ListNode cur = head;
            int size =1;
            while(cur.next!=null){
                cur = cur.next;
                size++;
            }
            int[] temp = new int[size];
            int[] res = new int[size];
            cur = head;
            int i = 0;
            while(cur!=null){
                temp[i] = cur.val;
                cur = cur.next;
                i++;
            }
            Stack<Integer> stack = new Stack<>();
            stack.push(0);
            for(int j=1;j<size;j++){
                //栈内是递增的
                if(!stack.isEmpty() && temp[stack.peek()]>=temp[j]){
                    //直接入栈即可
                    stack.push(j);
                }
                while(!stack.isEmpty() && temp[stack.peek()]<temp[j]){
                    i = stack.pop();
                    res[i] = temp[j];
                }
                stack.push(j);
            }
            return res;
        }

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

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

相关文章

Java:jdk的安装以及hello world

由于本人头发较多&#xff0c;常常被认为是不用功的程序员&#xff1b;故&#xff0c;我来学学Java&#xff0c;希望我变秃了也变强了&#xff01; 首先是java的安装&#xff0c;根据我司java的建议&#xff0c;安装了jdk8与jdk17&#xff01;因为在众多的版本中&#xff0c;只…

3.7——静态成员

静态数据成员 静态成员&#xff0c;指的是在c类中声明成员时可以加上static关键字&#xff0c;这样声明的成员就叫做静态成员&#xff08;包括数据成员和成员函数&#xff09;。即声明为static的类成员或者成员函数便能在类的范围内同享。 说明&#xff1a; 1&#xff09;静态数…

WordGPT正式版4.0安装教程

下载 https://www.xsoftnet.com/share/a0004MZyPvB5k.html产品介绍&#xff1a; WordGPT正式版来了&#xff0c;V4.0震撼发布&#xff0c;兼容Office与WPS&#xff0c;集提纲生成、内容创作、文本补全、文章润色、归纳总结、自定义提示词、快捷排版为一体的多场景智能文案创作…

IT知识百科:什么是超融合数据中心网络?

超融合数据中心网络&#xff08;Hyper-Converged Data Center Network&#xff09;是一种基于软件定义网络&#xff08;SDN&#xff09;和虚拟化技术的新型数据中心网络架构。该架构将计算、存储和网络三大要素融合在一起&#xff0c;实现了网络、计算、存储资源的统一管理&…

HTML5 拖放

文章目录HTML5 拖放拖放浏览器支持HTML5 拖放实例设置元素为可拖放拖动什么 - ondragstart 和 setData()放到何处 - ondragover进行放置 - ondropHTML5 拖放 拖放&#xff08;Drag 和 drop&#xff09;是 HTML5 标准的组成部分。 拖放 拖放是一种常见的特性&#xff0c;即抓取…

没有两把刷子还敢来面试测试开发工程师?

目录 前言 1.对测试开发的理解 2.为什么做测试而不是去做开发 3.如何处理矛盾 4.职业发展 5.你认为测试人员需要具备哪些素质。&#xff08;你有哪些优点围绕这些来说&#xff09; 6.你为什么能够胜任这个岗位 7.测试方法 黑盒测试 白盒测试 8.测试的阶段 9.测试的类…

【ROS2指南-7】理解ROS2的Action

目标&#xff1a; 理解并学习ROS 2 中的Action通信方式。 教程级别&#xff1a;初学者 时间&#xff1a; 15分钟 内容 背景 先决条件 任务 1 设置 2 使用动作 3 ros2节点信息 4 ros2 动作列表 5 ros2 动作信息 6 ros2界面展示 7 ros2 动作 send_goal 概括 下一步 …

敏捷开发项目如何做好中长期规划

在一次与客户的方案交流中&#xff0c;我们的团队意识到研发软件产品和建造房屋是比较相似的工作&#xff0c;两者都是长期项目&#xff0c;需要多个团队相互协调&#xff0c;都会有验收方进行确认。并且在项目进行过程中&#xff0c;想法总是在变化&#xff0c;不断会有新的需…

易点易动固定资产管理系统如何解决固定资产管理中的个性化需求

随着企业规模的扩大和企业管理需求的多样化&#xff0c;固定资产管理已经成为企业日常运营的重要环节。然而&#xff0c;传统的固定资产管理方式在满足企业个性化需求方面表现出明显的不足。在这种背景下&#xff0c;易点易动固定资产管理系统应运而生&#xff0c;为企业提供了…

代码随想录Day51

今天继续学习动规解决相关问题。 337.打家劫舍||| 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口&#xff0c;我们称之为 root 。 除了 root 之外&#xff0c;每栋房子有且只有一个“父“房子与之相连。一番侦察之后&#xff0c;聪明的小偷意识到“这个地方的所有…

【RabbitMQ学习日记】—— 初识RabbitMQ

一、消息队列 1.1 MQ的相关概念 1.1.1 什么是MQ MQ(message queue)&#xff0c;从字面意思上看&#xff0c;本质是个队列&#xff0c;FIFO 先入先出&#xff0c;只不过队列中存放的内容是 message 而已&#xff0c;还是一种跨进程的通信机制&#xff0c;用于上下游传递消息。…

MinIO从信息泄漏到RCE

文章目录信息泄露漏洞利用漏洞分析漏洞修复RCE漏洞分析参考文章信息泄露 漏洞利用 如果MinIO以集群方式部署&#xff0c;存在信息泄露漏洞&#xff0c;攻击者可以通过HTTP请求获取目标进程的所有环境变量&#xff0c;包括MINIO_SECRET_KEY和MINIO_ROOT_PASSWORD. vulhub有环…

paddle实现手写数字识别模型继续解读

要点&#xff1a; 手写数字识别用简单的线性进行分类效果比较差&#xff0c;添加卷积层和池化层效果会相对较好。参考文档&#xff1a;百度官方文档 一 网络结构 前几节我们尝试使用与房价预测相同的简单神经网络解决手写数字识别问题&#xff0c;但是效果并不理想。原因是手…

ROS开发之如何使用常用可视化工具?

文章目录0、引言1、rqt工具2、RViz工具3、Gazebo工具0、引言 笔者因研究课题涉及ROS开发&#xff0c;学习了古月居出品的ROS入门21讲&#xff0c;为巩固可视化工具的知识&#xff0c;本文将ROS的常用可视化工具使用一讲内容进行总结。    1、rqt工具 在终端输入&#xff1a;…

图解二叉搜索树

gitee代码:https://gitee.com/WangZihao64/data-structure-and-algorithm/tree/master/BST 一、概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值…

网站怎么接入chatGPT来自动写文章

用chatGPT写文章接入网站 将ChatGPT集成到网站中&#xff0c;可以让用户在网站上快速、简便地生成文章&#xff0c;并且可以提高用户体验。以下是一些用ChatGPT写文章接入网站的方法&#xff1a; 使用ChatGPT API接口&#xff1a;OpenAI提供了GPT-3 API接口&#xff0c;您可以…

c++11 常用新特性大总结

1.统一的初始化列表 在c98中我们经常会用{}初始化数组&#xff0c;而为了更近一步初始化我们在c11中采用{}的形式&#xff0c;代替等于号来帮助我们初始化的进行 举个例子&#xff1a; struct Point {int _x;int _y; }; int main() {int array1[] { 1, 2, 3, 4, 5 };int ar…

2023年七大最佳勒索软件解密工具

勒索软件是目前最恶毒且增长最快的网络威胁之一。作为一种危险的恶意软件&#xff0c;它会对文件进行加密&#xff0c;并用其进行勒索来换取报酬。 幸运的是&#xff0c;我们可以使用大量的勒索软件解密工具来解锁文件&#xff0c;而无需支付赎金。如果您的网络不幸感染了勒索软…

【MySQL】实验七 视图

文章目录 1. 建立city值为上海、北京的顾客视图2. 建立城市为上海的客户2016年的订单信息视图3. SQL视图:建立视图AVG_CJ4. SQL视图:建立视图IS_STUDENT5. SQL视图:建立视图CJ_STUDENT6. SQL视图:根据视图CJ_STUDENT创建视图CJ_TJ1. 建立city值为上海、北京的顾客视图 建立…

webgl-画一个彩色矩形

html <!DOCTYPE html> <head> <style> *{ margin: 0px; padding: 0px; } </style> </head> <body> <canvas id webgl> 您的浏览器不支持HTML5,请更换浏览器 </canvas> <script src"./main.js"></script&g…