当前位置: 首页 > news >正文

公务员写作材料网站/网页制作网站

公务员写作材料网站,网页制作网站,福步外贸论坛招聘,十堰网站建设兼职一、打家劫舍1 题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。…

一、打家劫舍1

题目:

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

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

示例 1:

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

示例 2:

输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。

思路:

明确dp数组的含义,本题dp数组的含义为包含前 i 个元素(包含 i)所得的最大值为dp[i],分别有两种情况

第一种

要第 i 个元素:此时第 i-1 个元素不能要,只能从第 i-2个元素拿,表达为dp[i-2]+nums[i]

第二种

不要第 i 个元素:此时应该从第 i-1 个元素选择拿与不拿,表达为dp[i-1]

因此可得递推式为

                                          dp[i] +=max(dp[i-1],dp[i-2]+nums[i])

代码:

public int rob(int[] nums) {// 如果输入数组为空或者长度为0,则没有房子可打劫,返回0if (nums == null || nums.length == 0)return 0;// 如果只有一个房子,只能打劫这个房子,直接返回其金额if (nums.length == 1)return nums[0];// dp 数组用来存储到第 i 个房子时能偷到的最大金额int[] dp = new int[nums.length + 1];// 初始化 dp 数组dp[0] = nums[0]; // 偷第一个房子时的最大金额dp[1] = Math.max(nums[0], nums[1]); // 偷第一个或第二个房子中金额较大的一个// 从第三个房子开始计算for (int i = 2; i < nums.length; i++) {// dp[i] 表示偷到第 i 个房子时的最大金额// 选择偷第 i 个房子的情况,应该加上之前能偷到的最大金额(即 dp[i-2]);// 或者选择不偷第 i 个房子,则最大金额等于 dp[i-1]dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}// 最终结果是到最后一个房子的最大金额return dp[nums.length - 1];
}
  1. 边界条件处理

    • if (nums == null || nums.length == 0) return 0;
      • 处理输入为空或没有房子的情况,直接返回 0
    • if (nums.length == 1) return nums[0];
      • 处理只有一个房子的情况,直接返回那个房子的金额。
  2. 动态规划数组初始化

    • int[] dp = new int[nums.length + 1];
      • 创建一个大小为 nums.length + 1 的数组 dpdp[i] 表示偷到第 i 个房子时的最大金额。
    • dp[0] = nums[0];
      • 如果只有第一个房子,那么偷这个房子的钱就是 dp[0]
    • dp[1] = Math.max(nums[0], nums[1]);
      • 比较前两个房子的金额,取较大的一个,因为只能选择偷第一个房子或第二个房子中的一个。
  3. 状态转移

    • for (int i = 2; i < nums.length; i++)
      • 从第三个房子开始计算。
      • dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);
        • 选择偷第 i 个房子的情况:此时的金额为 dp[i - 2] + nums[i]
        • 不偷第 i 个房子的情况:此时的金额为 dp[i - 1]
        • 取两者中的最大值作为 dp[i] 的值。
  4. 返回结果

    • return dp[nums.length - 1];
      • 最终返回 dp 数组最后一个元素,即偷到最后一个房子时能获得的最大金额。

二、打家劫舍2 

题目:

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

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

示例 1:

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

示例 2:

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

示例 3:

输入:nums = [1,2,3]
输出:3

思路:

与打家劫舍1不同的是,题中将nums数组连接成一个环形结构,因此存在三种情况

第一种:选择首元素和中间所有元素,尾元素则不能选取

第二种:选择尾元素和中间所有元素,首元素不能选择

第三种:首位元素均不选择,只选择中间的元素

第三种情况可以包含在第一种情况中,在第一种情况中如果我们不拿首元素即为第三种情况

因此需要讨论第一种和第二种情况中哪个可以拿到更多,取两种情况最大值

代码:

public int rob(int[] nums) {// 如果输入数组为空或长度为0,则没有房子可打劫,返回0if (nums == null || nums.length == 0)return 0;int len = nums.length;// 如果只有一个房子,只能打劫这个房子,直接返回其金额if (len == 1)return nums[0];// 计算两种情况的最大值// 1. 从第一个房子到倒数第二个房子(不打劫最后一个房子)// 2. 从第二个房子到最后一个房子(不打劫第一个房子)return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));
}int robAction(int[] nums, int start, int end) {int x = 0; // 代表上一个房子之前的最大金额int y = 0; // 代表上一个房子的最大金额int z = 0; // 当前房子的最大金额// 遍历从 start 到 end(不包括 end)范围内的房子for (int i = start; i < end; i++) {y = z; // 当前的最大金额之前的最大金额z = Math.max(y, x + nums[i]); // 当前房子的最大金额是之前最大金额和加上当前房子金额后的最大值x = y; // 更新 x 为之前的最大金额}return z; // 返回当前房子的最大金额
}

三、打家劫舍3

题目:

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

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

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

示例 1:

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

示例 2:

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

思路:

本题为树形结构,采用后序遍历的方法,相邻节点之间不能同时拿取,在定义dp数组时分别有两种情况,分别是dp[0],代表在不拿当前节点的情况下所偷取的最大金额,dp[1]代表在拿当前节点的情况下所偷取的最大金额

若不拿取当前节点的,则需要在其左右子节点中判断是否要拿去,若拿当前节点,则应跳过其左右子节点去判断是否拿取下一层的金额

代码:

public int rob(TreeNode root) {// 调用辅助函数 robAction 计算最大可窃取金额int[] res = robAction(root);// 返回 robAction 的结果中最大的值return Math.max(res[0], res[1]);
}int[] robAction(TreeNode root) {// res[0]: 不打劫当前房子的最大金额// res[1]: 打劫当前房子的最大金额int res[] = new int[2];// 如果当前节点为空,返回 [0, 0]if (root == null)return res;// 递归计算左子树和右子树的结果int[] left = robAction(root.left);int[] right = robAction(root.right);// res[0] 是不打劫当前房子的最大金额// 选择打劫左右子树中最大的金额res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);// res[1] 是打劫当前房子的最大金额// 当前房子的值加上左右子树不打劫的情况res[1] = root.val + left[0] + right[0];// 返回当前节点的结果return res;
}
  1. rob 方法

    • 参数TreeNode root 表示二叉树的根节点。
    • 功能:计算从根节点开始的最大可窃取金额。
    • 步骤
      • 调用 robAction 方法获取当前树的最大可窃取金额。
      • res 数组的两个元素分别表示打劫和不打劫根节点的情况。
      • 使用 Math.max 选择这两种情况中的较大值作为最终结果并返回。
  2. robAction 方法

    • 参数TreeNode root 表示当前处理的节点。
    • 返回值:一个数组 res,其中 res[0] 表示不打劫当前节点时的最大可窃取金额,res[1] 表示打劫当前节点时的最大可窃取金额。
    • 步骤
      • 初始化 res 数组为 [0, 0],表示当前节点为空时的结果。
      • 如果当前节点为 null,直接返回 [0, 0],因为没有任何价值可以打劫。
      • 递归调用 robAction 方法处理左子树和右子树,分别将结果存储在 left 和 right 中。
      • res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);
        
      • 在这种情况下,可以选择打劫或不打劫左右子树,从而得到最大金额。
        res[1] = root.val + left[0] + right[0];
        
      • 在这种情况下,打劫当前节点的值,并且左右子树的最大金额必须是它们分别不打劫的情况。
      • 返回 res 数组,包含当前节点的打劫和不打劫情况的最大金额。

今天的学习就到这里

相关文章:

算法日记day 39(动归之打家劫舍)

一、打家劫舍1 题目&#xff1a; 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。…...

Vue 生命周期详解含demo、面试常问问题案例

Vue 生命周期详解、面试常问问题案例 含 demo 文章目录 Vue 生命周期详解、面试常问问题案例 含 demo一、Vue 生命周期是什么二、Vue 中如何使用生命周期钩子1. **beforeCreate**2. **created**3. **beforeMount**4. **mounted**5. **beforeUpdate**6. **updated**7. **beforeD…...

表单自定义规则的校验

在 Vue 3 中使用 Element Plus 的表单组件进行自定义规则的校验非常方便。Element Plus 提供了 ElForm 和 ElFormItem 组件&#xff0c;它们内置了表单验证的功能。下面我将详细介绍如何使用 Element Plus 进行自定义规则的校验。 创建表单及规则 首先&#xff0c;你需要创建…...

JVM 有哪些垃圾回收算法(回收机制)?

JVM 有哪些垃圾回收算法&#xff08;回收机制&#xff09;&#xff1f; 标记-清除算法 在Java虚拟机中&#xff0c;标记-清除算法是一种用于垃圾回收的算法。它分为两个阶段&#xff1a;标记阶段和清除阶段。 在标记阶段&#xff0c;垃圾收集器会遍历堆内存中的所有对象&…...

2024年高教社杯数学建模国赛A题思路解析+代码+论文

2024年高教社杯全国大学生数学建模竞赛&#xff08;以下简称国赛&#xff09;将于9月5日晚6时正式开始。 下文包含&#xff1a;2024国赛思路解析​、国赛参赛时间及规则信息说明、好用的数模技巧及如何备战数学建模竞赛 C君将会第一时间发布选题建议、所有题目的思路解析、相…...

Linux中yum、vim、gcc/g++的使用

目录 一、Linux 软件包管理器 yum 什么是软件包 关于 rzsz 查看软件包★ 如何安装软件★ 如何卸载软件★ Linux 开发工具 二、Linux编译器-vim使用 vim的基本概念 vim的基本操作 vim正常模式命令集 vim末行模式命令集 vim操作总结 如果在vim界面不小心按了Ctrl …...

基于模糊神经网络的金融序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于模糊神经网络的金融序列预测算法matlab仿真,根据序列的MAD,RSI,KD等指标实现序列的预测和最终收益分析。 2.测试软件版本以及运行结果展示 MATLAB2022A版本…...

STM32 HAL库常用功能封装

关中断 /*** brief 关闭所有中断(但是不包括fault和NMI中断)* param 无* retval 无*/ void sys_intx_disable(void) {__ASM volatile("cpsid i"); }开中断 /*** brief 开启所有中断* param 无* retval 无*/ void sys_intx_enabl…...

golang zap日志库 打印日志时显示的源文件始终是同一个问题解决方法 zap.Option函数可选项 zap.AddCallerSkip(1) 使用示例

这种情况一般出现在我们对zap日志库进行二次封装的情况下&#xff0c; 在打印日志的时候的源文件非我们期望的文件&#xff0c;如下 原因分析 出现这个问题的原因是zap函数内部在调用 runtime.Caller 时的skip层级不对了&#xff0c;因为我们进行了二次封装&#xff0c;所以za…...

BL196MQTT远程IO模块助力智能楼宇自动化升级

在智能楼宇自动化领域&#xff0c;每一个细节的优化都能带来整体效率与舒适度的显著提升。钡铼技术的BL196MQTT远程IO模块&#xff0c;以其卓越的灵活性和强大的性能&#xff0c;正在成为这一领域中推动楼宇自动化升级的关键力量。 钡铼技术IOy系列&#xff1a;创新与灵活性的…...

【面试宝典】Java面向对象面试题总结(上)

一、重写和重载 在Java中&#xff0c;重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;是面向对象编程中两个非常重要的概念&#xff0c;它们都与方法的定义和调用有关&#xff0c;但两者有着本质的区别。 1、重写&#xff08;Override&#xff…...

如何运用独特的产业运营体系打造一流的数字媒体产业园

如何运用独特的产业运营体系打造一流的数字媒体产业园 2024-08-15 17:37树莓集团 在数字经济蓬勃发展的今天&#xff0c;数字媒体产业作为其中的重要一环&#xff0c;正展现出巨大的潜力和活力。而如何运用独特的产业运营体系&#xff0c;打造一流的数字媒体产业园&#xff0…...

安全基础学习-SHA-256

SHA-256 是一种密码学哈希函数,是 SHA-2(Secure Hash Algorithm 2)家族的一部分。它被广泛用于数据完整性验证、数字签名以及密码存储等领域。 1、SHA-256的原理 SHA-256 生成一个固定长度为 256 位(32 字节)的哈希值。无论输入数据的大小或类型,输出的哈希值始终是 25…...

Redis中Big Key该如何解决?

目录 1、Big Key的产生 2、BigKey场景分析 3、Big Key的危害 4、检测 BigKey 5、解决 BigKey 问题 Big Key拆分 &#xff08;1&#xff09;按时间/业务拆分 &#xff08;2&#xff09;按哈希&#xff08;Hash&#xff09;拆分 &#xff08;3&#xff09;按前缀树拆分…...

基于springboot的实习管理系统

TOC springboot207基于springboot的实习管理系统 绪论 1.1研究背景与意义 信息化管理模式是将行业中的工作流程由人工服务&#xff0c;逐渐转换为使用计算机技术的信息化管理服务。这种管理模式发展迅速&#xff0c;使用起来非常简单容易&#xff0c;用户甚至不用掌握相关的…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测

土地利用/土地覆盖数据是生态、环境和气象等领域众多模型的重要输入参数之一。基于遥感影像解译&#xff0c;可获取历史或当前任何一个区域的土地利用/土地覆盖数据&#xff0c;用于评估区域的生态环境变化、评价重大生态工程建设成效等。借助CLUE模型&#xff0c;实现对未来土…...

Rust 之环境搭建

前言 Rust 是一种现代的系统级编程语言&#xff0c;以其内存安全性、高性能和简洁的语法而著称。本文将介绍如何在不同操作系统上搭建 Rust 开发环境&#xff0c;并配置好基础工具&#xff0c;使您能够快速开始 Rust 编程。 1. 安装 Rust Rust 官方推荐使用 rustup 工具来管…...

基于微信小程序地图实现点位标注、覆盖物、地图聊天

目录 小程序部分map标签的使用获取用户经纬度并转换地址地图点击事件覆盖物标注点击并实现弹窗交互数据库及接口部分数据库表结构设计API搭建小程序接口使用注意事项wx.getLocation深入控制地图小程序部分 map标签的使用 创建小程序的步骤这里不再重复赘述,在wxml页面中放一个…...

xxl-job的分片广播+单播

1 介绍一下xxl-job XXL-JOB 是一个分布式任务调度平台&#xff0c;旨在为分布式应用系统提供开箱即用的调度解决方案。它非常易于使用&#xff0c;并具有很高的可扩展性。以下是 XXL-JOB 的详细介绍&#xff0c;包括其核心功能、架构设计、主要组件及其应用场景。 核心功能 简…...

情感分类代码

在进行自然语言处理中的情感分类时&#xff0c;通常需要准备以下几方面的内容&#xff1a; 1. **数据集**&#xff1a;高质量的标注数据集是关键&#xff0c;包括正面、负面和中性情感标记的文本。 2. **情感词典**&#xff1a;可用的情感词典&#xff0c;如SentiWordNet&…...

WPF—常用控件、属性、事件、详细介绍

WPF—常用控件、属性、事件、详细介绍 WPF&#xff08;Windows Presentation Foundation&#xff09;是微软推出的基于Windows 的用户界面框架&#xff0c;属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架&#xff0c;真正做到了分离界面设计人员与开发人…...

Oracle遭遇bug导致共享内存无法分配报ORA-04031错误

1.故障描述 在7月17日上午11时左右&#xff0c;收到告警短信&#xff0c;提示集群节点2宕机&#xff0c;当即登陆该节点进行查看&#xff0c;发现数据库状态正常。但日志里出现大量的ORA-04031报错&#xff0c;提示无法分配shared_pool&#xff0c;当时手动执行shared pool刷新…...

SAP BRIM用于应收账款AR收入中台

SAP BRIM&#xff08;Billing and Revenue Innovation Management&#xff09;是SAP提供的一个综合性解决方案&#xff0c;旨在帮助企业高效管理计费和收入流程。它与SAP ERP系统集成&#xff0c;提供端到端的功能&#xff0c;简化计费流程&#xff0c;自动化收入确认&#xff…...

LVS原理简介

LVS是Linux virtual server的缩写&#xff0c;为linux虚拟服务器&#xff0c;是一个虚拟的服务器集群系统。LVS简单工作原理为用户请求LVS VIP&#xff0c;LVS根据转发方式和算法&#xff0c;将请求转发给后端服务器&#xff0c;后端服务器接收到请求&#xff0c;返回给用户。对…...

Qt五大核心特性之元对象系统

前言 Qt 的元对象系统&#xff08;Meta-Object System&#xff09;是 Qt 框架的核心之一&#xff0c;提供了一些 C 原生不具备的功能(因为在C它们是静态的)&#xff0c;如反射、信号槽机制、属性系统等。通过这个系统&#xff0c;Qt 实现了许多强大的功能&#xff0c;这使得它…...

开放式耳机伤耳朵吗?开放式耳机在一定程度上保护我们的耳朵

开放式耳机通常被认为对耳朵的伤害较小&#xff0c;因为它们不需要插入耳道&#xff0c;从而减少了耳道内的压力和潜在的感染风险。与传统入耳式耳机相比&#xff0c;开放式耳机允许耳朵自然通风&#xff0c;减少耳道内的湿气和热量积聚&#xff0c;这有助于保持耳朵的健康。 然…...

JAVA打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车系统源码

&#x1f697;&#x1f4a8;打车、顺风车、滴滴车&跑腿系统&#xff0c;一键解决出行生活难题&#xff01; 一、出行新选择&#xff0c;打车从此不再难 忙碌的生活节奏&#xff0c;让我们常常需要快速、便捷的出行方式。打车、顺风车、滴滴车系统&#xff0c;正是为了满足…...

批量智慧:揭秘机器学习中的批量大小

标题&#xff1a;批量智慧&#xff1a;揭秘机器学习中的批量大小 机器学习是人工智能的一个分支&#xff0c;它使得计算机能够从数据中学习并做出决策或预测。在机器学习的过程中&#xff0c;批量大小&#xff08;Batch Size&#xff09;是一个至关重要的超参数&#xff0c;它…...

苹果Vision Pro生态发展:现状、挑战与未来展望

苹果公司以其创新技术和强大的生态系统闻名于世。在最近的财报会议上,CEO蒂姆库克分享了Vision Pro平台的最新进展,引发了业界的广泛关注。本文将深入探讨Vision Pro生态的现状、面临的挑战以及与其他XR平台的对比分析。 一、Vision Pro生态现状 据库克介绍,Vision Pro平台…...

湖南第一师范学院来访炼石,推动密码与数据安全合作

2024年8月11日&#xff0c;为进一步加强交流与合作&#xff0c;深入探讨校企产学研合作&#xff0c;湖南第一师范学院计算机学院院长杨恒伏一行莅临炼石调研指导。湖南第一师范学院计算机学院院长杨恒伏、网络空间安全系主任周聪等专家领导出席。炼石网络创始人兼CEO白小勇对湖…...