代码随想录Day_48打卡

news2024/12/24 2:57:53

①、打家劫舍

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

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

事例:

输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
     偷窃到的最高金额 = 1 + 3 = 4 。

思路:

        使用动态规划,对于每个房间,只有两种选择,偷还是不偷,若选择偷的话,则只能加上前两个房间偷取的最大金额,即上一个房间不偷,若不偷,则为从第一个房间到前一个房间偷取的最大金额,两者取最大值即可。

动态规划:

        dp定义及含义:dp[j]表示从第一个房间到第j个房间能偷取的最大金额

        状态转移方程:dp[j] = Math.max(dp[j - 1],dp[j - 2] + nums[j])

        初始化:dp[0] = nums[0] 只能投第一个房间 dp[1] = Math.max(nums[0],num[1]),前两个房间就选个钱多的。

        遍历顺序:房间从小到大遍历

        dp[nums.length - 1]即为答案。

代码:

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

②、打家劫舍Ⅱ

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

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

事例:

输入:nums = [2,3,2]
输出:3
解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。

思路:

        与上一题类似,只是首尾多了个环形判断,需要进行解环操作。可以将环截成两个链,如对第一家到最后第二家进行打劫,然后再从头开始,对第二家到最后一家进行打劫,最后返回两个打劫的最大值即可。打劫代码跟上题一致。

代码:

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

③、打家劫舍Ⅲ

小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。

除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 如果 两个直接相连的房子在同一天晚上被打劫 ,房屋将自动报警。

给定二叉树的 root 。返回 在不触动警报的情况下 ,小偷能够盗取的最高金额 。

事例:

输入: root = [3,2,3,null,3,null,1]
输出: 7 
解释: 小偷一晚能够盗取的最高金额 3 + 3 + 1 = 7

思路:

        这道题的社区结构变成了树形,对于树,我们得选择一种遍历方式,打劫该结点与否取决于左右孩子是否打劫的金额最大值,故可以采用递归,返回值为处理左右孩子的数据,以便后续判断,故选择后序遍历。

递归:

        使用后序遍历

        返回值:int[],约定int[0]为该不打劫该节点,int[1]为打劫该结点,返回参数可以直接给根结点构造成新参数,层层返回到最终结果。

        最后返回root[0],root[1]中的最大值即为答案。

动态规划:

        dp定义及含义:dp其实就是递归函数的返回值,其中dp[0]表示不打劫当前结点的最大金额,dp[1]表示打劫当前结点的最大金额。

        状态转移方程:构造dp数组,dp[0] = Math.max(leftDp[0],left[1]) + Math.max(rightDp[0],rightDp[1]),dp[1] = root.val + leftDp[0] + rightDp[1]

        初始化:遇到空节点时,返回new int[]{0,0}

        遍历顺序:后序遍历,因为根节点是否打劫需要根据左右孩子是否打劫

        最终返回的值为:根节点是否打劫的最大金额,返回其中的最大值即可。

代码:

public int rob(TreeNode root) {
        int[] resDp = dpRoot(root);
        int res = Math.max(resDp[0],resDp[1]);
        return res;
    }

    public int[] dpRoot(TreeNode root){
        if(root == null) return new int[]{0,0};
        int[] leftDp = dpRoot(root.left);
        int[] rightDp = dpRoot(root.right);
        int value1 = root.val + leftDp[0] + rightDp[0];
        int value0 = Math.max(leftDp[0],leftDp[1]) + Math.max(rightDp[0],rightDp[1]);
        return new int[]{value0,value1};
    }

参考:代码随想录 (programmercarl.com)

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

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

相关文章

Yolov1原理详细解读及实战(一)理论篇

什么是Yolov1? Yolo(You Only Look Once)是一种one-stage目标检测算法&#xff0c;即仅需要 “看” 一次就可以识别出图片中物体的class类别和位置。作为one-stage的开山鼻祖&#xff0c;YOLOv1以其简洁的网络结构和GPU上的实时检测速度而一鸣惊人&#xff0c;打破了R-CNN的“…

Linux centos7 bash编程(break和continue)

在学习shell知识时&#xff0c;简单编程要从格式入手。 首先学习好单行注释和多行注释。 先学习简单整数的打印输出&#xff0c;主要学习echo命令&#xff0c;学习选项-e -n的使用。 下面的练习是常用的两个分支程序&#xff1a;break和continue。 #!/bin/bash # 这是单行注…

极氪汽车的云资源治理细探

作者&#xff1a;极氪汽车吴超 前言 2021 年&#xff0c;极氪 001 迅速崭露头角&#xff0c;仅用 110 天便创下了首款车型交付量“最快破万”的纪录。2022 年 11 月&#xff0c;极氪 009 在短短 76 天内便率先完成了首批交付&#xff0c;刷新了中国豪华纯电品牌交付速度的纪录…

算法通过村第四关-栈白银笔记|括号问题

文章目录 前言1. 括号匹配问题2. 最小栈问题3. 最大栈 总结 前言 提示&#xff1a;如果让我送给年轻人四个字&#xff0c;就是&#xff1a;量力而行。 量力而行不会失眠&#xff0c;不会啃老&#xff0c;不会为各种考试焦虑。顺其自然活得轻松。其实&#xff0c;量力而行最易大…

数据库集群的简单了解

Update 关于操作的日志 1.0 redo log 读一次写一次 一共2次, 不安全 注意redo log是顺写 而file是随机 所以Mysql做出类似HDFS的操作 行为日志和数据分离&#xff0c;但是不同的是&#xff0c;Mysql在内存中操作修改&#xff0c;如果不出事故&#xff0c;由内存中的行为来直接…

Yolov1原理详细解读及实战(二)实战篇

在Yolov1原理详细解读及实战&#xff08;一&#xff09;理论篇 中&#xff0c;我们对Yolov1网络结构、算法流程、训练及推理原理进行了详细剖析&#xff0c;本章进入实战环节&#xff0c;话不多说&#xff0c;马上开始&#xff01; 环境 vscodeWSL:Ubuntu 18.04python 3.9.7 …

wireshark过滤器的使用

目录 wiresharkwireshark的基本使用wireshark过滤器的区别 抓包案例 wireshark wireshark的基本使用 抓包采用 wireshark&#xff0c;提取特征时&#xff0c;要对 session 进行过滤&#xff0c;找到关键的stream&#xff0c;这里总结了 wireshark 过滤的基本语法&#xff0c;…

外卖订餐系统源码:数字化时代餐饮服务的创新之道

在如今快节奏的生活中&#xff0c;外卖订餐系统源码正成为餐饮业界的一股创新浪潮。它为餐厅和创业者提供了一个数字化的平台&#xff0c;使订餐与配送更加便捷、高效。本文将为您展示如何使用外卖订餐系统源码创建一个简单但功能强大的订餐平台。 # 导入必要的模块 import d…

离线竞价功能说明及设置

为了更加方便广大用户不再熬夜竞价&#xff0c;西部数码推出了离线竞价功能&#xff0c;现已正式上线&#xff0c;欢迎大家使用反馈。 1、离线竟价功能说明 当您拥有域名的出价权限时&#xff0c;您可在 【我参与的竞价】或【我出价的域名】列表选中域名开启离线竟价。 设置…

固定资产管理系统都需要考虑哪些问题?

企业管理中固定资产的追踪和管理是非常重要的一环。固定资产不仅包括房屋、土地、机器设备等大量的资产&#xff0c;也包括低值易耗品。因为这些资产往往是企业生产或者管理过程中不可或缺的。在使用和管理过程中&#xff0c;往往涉及到转移、借调、维护等方面。如何进行有效的…

健康安全的新定义,照明舒适达到巅峰,SUKER书客护眼台灯L1震撼发售

深耕照明领域多年的SUKER书客&#xff0c;这一次给大家带来一份大惊喜。在最近正式发布新品——SUKER书客护眼台灯L1&#xff0c;这款护眼台灯承载着在照明领域的前沿技术&#xff0c;能保证照明安全健康和舒适度并带来非常优秀的护眼效果。作为书客在护眼台灯领域的颠覆式新品…

【FaceChain风格DIY手把手教程】无限场景风格LoRA与固定人物LoRA的融合(4Kstar!)

先看效果 以上风格LoRA分别为&#xff1a;户外花园婚纱、冬季雪景汉服、火焰女神、仙侠风 环境准备 在魔搭平台ModelScope 魔搭社区中选择PAI-DSW-GPU环境 进入后打开terminal环境&#xff0c;先检查显存需要20G左右&#xff08;nvidia-smi&#xff09;&#xff0c;然后下载核…

面试题-React(七):React组件通信

在React开发中&#xff0c;组件通信是一个核心概念&#xff0c;它使得不同组件能够协同工作&#xff0c;实现更复杂的交互和数据传递。常见的组件通信方式&#xff1a;父传子和子传父 一、父传子通信方式 父组件向子组件传递数据是React中最常见的一种通信方式。这种方式适用…

什么是可观测性

可观测性是指使用从其组件收集的累积信息来了解系统或应用程序的当前状态&#xff0c;可观测性通常侧重于监视整个系统或应用程序&#xff0c;而不是单独管理元素&#xff0c;完全可观察的环境将深入了解网络堆栈&#xff0c;并始终保持网络基础设施处于最佳工作状态。 什么是…

整数拆分乘积最大

将一个整数拆分为若干个自然数的和&#xff0c;如果要使这些数的乘积最大&#xff0c;应该尽可能的拆分出3。 任意一个数字可以由多个3的n次方的和&#xff08;差&#xff09;表示。 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class M…

k8s的学习篇1

一 k8s的概念 1.1 k8s k8s是一个轻量级的&#xff0c;用于管理容器化应用和服务的平台。通过k8s能够进行应用的自动化部署和扩容缩容。 1.2 k8s核心部分 1.prod: 最小的部署单元&#xff1b;一组容器的集合&#xff1b;共享网络&#xff1b;生命周期是短暂的&#xff1b; …

<C++> 继承

1.继承的概念和定义 继承是面向对象其中的一个核心概念之一&#xff0c;继承允许一个类&#xff08;称为子类或派生类&#xff09;从另一个类&#xff08;称为父类或基类&#xff09;继承属性和行为&#xff0c;以便在子类中重用已有的代码并添加新的功能。通过继承&#xff0…

yo!这里是Linux基础开发工具介绍

目录 前言 基础开发工具 yum vim 1.基本介绍 2.基本操作 3.正常模式常用命令 4.底行模式常用命令 gcc/g gdb 1.基本介绍 2.常用操作 make/Makefile 1.背景 2.介绍 3.使用 git 1.介绍 2.操作 进度条程序简单实现 后记 前言 在学完初步的基础指令及权限控…

Spring Boot进阶(60):5种判断线程池任务是否全部完成的方案 | 实用技巧分享!

1. 前言&#x1f525; 多线程编程在现代软件开发中非常常见且重要&#xff0c;而线程池是多线程编程的常用技术。在使用线程池时&#xff0c;通常需要判断线程池中的任务是否全部完成&#xff0c;以便决定程序继续执行的下一步操作。本文将介绍5种判断线程池任务是否全部完成的…