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

JAVA代码编写

198.打家劫舍

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

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

示例 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 。

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 400

教程:https://programmercarl.com/0198.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8D.html

方法一:动态规划

思路:偷的金额就是物品,需要间隔开偷放入背包,找最大值。

步骤

  1. 定义dp [i]: 偷前i个索引的最高金额为dp[i]

  2. 递推公式:这次是我退出来的,可以,数学归纳法

    dp[0] =nums[0]

    dp[1] =max(dp[0],nums[1])

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

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

  3. dp数组初始化:dp[0] =nums[0],dp[1]=max(nums[0],nums[1])

  4. 确定遍历顺序:

    前到后遍历

  5. 举例推导dp数组,

    以示例二,输入[2,7,9,3,1]为例。

在这里插入图片描述

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)
class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0) return 0;if (nums.length == 1) return nums[0];int[] dp = new int[nums.length];dp[0] = nums[0];dp[1] = Math.max(dp[0], nums[1]);for (int i = 2; i < nums.length; i++) {dp[i] = Math.max(dp[i - 1], dp[i - 2] + nums[i]);}return dp[nums.length - 1];}
}

213.打家劫舍II

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

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

示例 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.length <= 100
  • 0 <= nums[i] <= 1000

教程:https://programmercarl.com/0213.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DII.html

方法一:动态规划

思路:在198.打家劫舍基础上加了一个首尾不能同时偷的限制。偷的金额就是物品,需要相邻间隔开(首尾不能同时拿)偷放入背包,找最大值。

对于一个数组,成环的话主要有如下三种情况:

  • 情况一:考虑不包含首尾元素

213.打家劫舍II

  • 情况二:考虑包含首元素,不包含尾元素

213.打家劫舍II1

  • 情况三:考虑包含尾元素,不包含首元素

213.打家劫舍II2

而情况二 和 情况三 都包含了情况一了,所以只考虑情况二和情况三就可以了

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)
class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0)return 0;int len = nums.length;if (len == 1)return nums[0];return Math.max(robAction(nums, 0, len - 1), robAction(nums, 1, len));}int robAction(int[] nums, int start, int end) {int x = 0, y = 0, z = 0;for (int i = start; i < end; i++) {y = z;z = Math.max(y, x + nums[i]);x = y;}return z;}
}

337.打家劫舍 III

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

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

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

示例 1:

img

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

示例 2:

img

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

提示:

  • 树的节点数在 [1, 104] 范围内
  • 0 <= Node.val <= 104

教程:https://programmercarl.com/0337.%E6%89%93%E5%AE%B6%E5%8A%AB%E8%88%8DIII.html

方法一:动态规划

思路:偷的金额就是物品,需要间隔开偷放入背包,找最大值。和198.打家劫舍差不多,就是数据结构换成了二叉树。

本题一定是要后序遍历,因为通过递归函数的返回值来做下一步计算

如果抢了当前节点,两个孩子就不能动,如果没抢当前节点,就可以考虑抢左右孩子(注意这里说的是“考虑”

复杂度分析

  • 时间复杂度:O(n),其中 n 是二叉树中节点的个数
  • 空间复杂度: O(h),其中 h 是二叉树的高度
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;}
}// 3.状态标记递归
// 执行用时:0 ms , 在所有 Java 提交中击败了 100% 的用户
// 不偷:Max(左孩子不偷,左孩子偷) + Max(右孩子不偷,右孩子偷)
// root[0] = Math.max(rob(root.left)[0], rob(root.left)[1]) +
// Math.max(rob(root.right)[0], rob(root.right)[1])
// 偷:左孩子不偷+ 右孩子不偷 + 当前节点偷
// root[1] = rob(root.left)[0] + rob(root.right)[0] + root.val;
class Solution {public int rob3(TreeNode root) {int[] res = robAction1(root);return Math.max(res[0], res[1]);}int[] robAction1(TreeNode root) {int res[] = new int[2];if (root == null)return res;int[] left = robAction1(root.left);int[] right = robAction1(root.right);res[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]);res[1] = root.val + left[0] + right[0];return res;}public static void main(String[] args) {Solution solution = new Solution();TreeNode t1 = new TreeNode(4,new TreeNode(1),new TreeNode(3));TreeNode t2 = new TreeNode(5);TreeNode t3 = new TreeNode(1);t2.right = t3;TreeNode root = new TreeNode(3);root.left=t1;root.right=t2;solution.rob3(root);}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python从入门到精通

一、Python基础语法 1、字面量 掌握字面量的含义了解常见的字面量类型基于print语句完成各类字面量的输出 什么是字面量&#xff1f; 字面量&#xff1a;在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面量 常用的值类型 Python中常用的有6种值&#xff…

AI联盟!甲骨文、英特尔、Meta等57家组织参与

全球社交、科技巨头Meta在官网宣布&#xff0c;与甲骨文、英特尔、AMD、IBM、索尼、戴尔等57家科技、学术研究机构组成——AI联盟。 在这57家组织中很多是大模型开源领域的领导者&#xff0c;例如&#xff0c;类ChatGPT模型的开源鼻祖Meta&#xff1b; 文生图领域最知名开源平…

pytorch与cuda环境安装操作

Pytorch 安装 11.8 Windows版本的 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 在cmd或者power shell中运行 ![需要python环境] 安装完成后可以使用以下命令检测cuda是否安装好 nvidia-smi Thu Dec 7 19:51:03 2023 ----…

外贸自建站是什么意思?做海洋建站的好处?

外贸自建站什么意思&#xff1f;跨境电商自建站的好处有哪些&#xff1f; 外贸自建站是指外贸企业或个人通过建站的方式&#xff0c;搭建自己的电子商务网站&#xff0c;用于开展海外贸易和拓展国际市场。海洋建站将详细介绍外贸自建站&#xff0c;帮助您更好地理解并开展外贸…

Git篇---第三篇

系列文章目录 文章目录 系列文章目录前言一、git pull 和 git fetch 有什么区别?二、git中的“staging area”或“index”是什么?三、什么是 git stash?前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章…

Linux常用命令——zip命令

文章目录 1. 简介2. 基本语法3. 常用选项4. 使用实例实例 1: 压缩单个文件实例 2: 压缩多个文件实例 3: 递归压缩目录实例 4: 创建密码保护的压缩文件 5. 结论 1. 简介 zip 是一个在Linux系统中广泛使用的压缩工具。它可以用来创建压缩文件&#xff08;通常是.zip格式&#xf…

泡沫包装市场分析:预计2029年将达到659亿元

泡沫包装&#xff0c;简单地讲&#xff0c;就是用数学方法对无线电测量或光学测量所获得的弹道数据进行检验、整理、校正、计算&#xff0c;减小或消除数据的误差&#xff0c;得出反映运载火箭运动轨迹的精确弹道参数。通常所说的泡沫包装&#xff0c;主要是指由可发性聚苯乙烯…

Modelscope Agent初体验与思考

背景&#xff1a;LLM → \to → Agent ChatGPT为代表的大语言模型就不用过多的介绍了&#xff0c;ChatGPT很强大&#xff0c;但是也有做不到的东西。 例如&#xff1a; 实时查询问题&#xff1a;实时的天气&#xff0c;地理位置&#xff0c;最新新闻报道&#xff0c;现实世…

100:ReconFusion: 3D Reconstruction with Diffusion Priors

简介 官网 少样本重建必然导致nerf失败&#xff0c;论文提出使用diffusion模型来解决这一问题。从上图不难看出&#xff0c;论文一步步提升视角数量&#xff0c;逐步与Zip-NeRF对比。 实现流程 Diffusion Model for Novel View Synthesis 给定一组输入图像 x o b s { x i…

【C++初阶】七、内存管理(C/C++内存分布、C++内存管理方式、operator new / delete 函数、定位new表达式)

相关代码gitee自取&#xff1a; C语言学习日记: 加油努力 (gitee.com) 接上期&#xff1a; 【C初阶】六、类和对象&#xff08;初始化列表、static成员、友元、内部类&#xff09;-CSDN博客 目录 一 . C/C内存分布 C/C中程序内存区域划分&#xff1a; 二 . C内存管理方式 …

docker的基本管理和概念

docker是什么&#xff1f; docker是开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机”。 docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器 docker的宿主机是linux系统。集装箱可以理解为相互…

CTF竞赛密码学题目解析

CTF&#xff08;Capture The Flag&#xff09;竞赛是一个有趣的挑战。密码学是CTF竞赛中的核心元素之一&#xff0c;通常涉及解密、破译密码、理解加密算法等技能。以下是30个题目及答案&#xff0c;新入行的可以看看鸭。 题目及答案 1. Caesar Cipher 描述&#xff1a;给出一…