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

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架

  • 前言
  • 一. 填充书架
    • 1.1 优化

前言

想要精通算法和SQL的成长之路 - 系列导航

一. 填充书架

原题链接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目中有一个值得注意的点就是:

  • 需要按照书本顺序摆放。
  • 每一层当中,只要厚度不够了,当前层最高的那一本书籍就视为本层的高度。

那么我们假设dp[i]: 代表从 book[0] 摆到 book[i] 的时书架的最小高度。

  • 假设最后一层的第一本书的下标是 j,那么之前所有书本摆放的最小高度就是 dp[j-1]
  • 我们再计算出,下标在[j,i](最后一层)的书本中,高度最高的那一本书(同时满足厚度不超过shelfWidth),高度为maxHeight
  • 那么当前的最小总高度是 res = Max(dp[i-1]+maxHeight,res)。即之前的总高度+最后一层的最高高度。

我们递归,从后往前递归。入参为遍历的书本下标。

  1. 终止条件:下标 <0。代表没有书本了,停止递归。
  2. 递归做的事情:循环[0,i]之间的所有元素,从后往前把书本放入最后一层,一旦厚度超出,终止遍历。否则,计算当前层的最高高度以及最小总高。
public class Test1105 {public int[][] books;public int shelfWidth;public int minHeightShelves(int[][] books, int shelfWidth) {this.books = books;this.shelfWidth = shelfWidth;return dfs(books.length - 1);}public int dfs(int i) {// 终止条件if (i < 0) {return 0;}int res = Integer.MAX_VALUE, maxHeight = 0, width = shelfWidth;for (int j = i; j >= 0; j--) {// 从后往前放书本width -= books[j][0];// 厚度不能超过 shelfWidth ,超过就代表放不下了if (width < 0) {break;}// 当前层最高高度maxHeight = Math.max(maxHeight, books[j][1]);// 更新总最低书架高度 = 上层最小总高度 + 当前层最高高度res = Math.min(res, dfs(j - 1) + maxHeight);}return res;}
}

这个解答其实对于用例比较多的情况,是会超时的。

1.1 优化

我们来看下上面代码的不好的点:

  • 每次dfs的时候,循环的范围是:[0,j]
  • 循环内部又每次调用了dfs递归,即dfs[j-1]

整个递归函数,只用到了一个索引的参数,我们可以发现,索引为1,2,3…的递归,被重复调用了非常多次。以当前索引为3为例:

  • 第一次递归范围:[0,3]。
  • 第二次递归范围:[0,2]。
  • 第三次递归范围:[0,1]。

那么我们可以用一个全局的变量去记录每次dfs返回的结果即可:

public class Test1105 {public int[][] books;public int shelfWidth;// 缓存dfs的结果public int[] dfsCache;public int minHeightShelves(int[][] books, int shelfWidth) {this.books = books;this.shelfWidth = shelfWidth;// 初始化dfsCache = new int[books.length];// 给个初始值,-1代表没有被执行过,即没有缓存Arrays.fill(dfsCache, -1);return dfs(books.length - 1);}public int dfs(int i) {// 终止条件if (i < 0) {return 0;}// 如果是-1,代表这层值没有执行过,往下走。否则,说明有缓存了,直接返回if (dfsCache[i] != -1) {return dfsCache[i];}int res = Integer.MAX_VALUE, maxHeight = 0, width = shelfWidth;for (int j = i; j >= 0; j--) {// 从后往前放书本width -= books[j][0];// 厚度不能超过 shelfWidth ,超过就代表放不下了if (width < 0) {break;}// 当前层最高高度maxHeight = Math.max(maxHeight, books[j][1]);// 更新总最低书架高度 = 上层最小总高度 + 当前层最高高度res = Math.min(res, dfs(j - 1) + maxHeight);}// 缓存下当前结果dfsCache[i] = res;return dfsCache[i];}
}

相关文章:

想要精通算法和SQL的成长之路 - 填充书架

想要精通算法和SQL的成长之路 - 填充书架 前言一. 填充书架1.1 优化 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 填充书架 原题链接 题目中有一个值得注意的点就是&#xff1a; 需要按照书本顺序摆放。每一层当中&#xff0c;只要厚度不够了&#xff0c;当前层最高…...

【ROS入门】ROS的核心概念

文章结构 通信机制节点(Node)——执行单元节点管理器(ROS Master)——控制中心话题通信——异步通信机制话题(Topic)消息(Message)——话题数据 服务通信——同步通信机制服务(Service) 话题和服务的区别参数(Parameter)——全局共享字典 文件系统功能包&#xff08;Package&am…...

Python爬虫从端到端抓取网页

网页抓取和 REST API 简介 网页抓取是使用计算机程序以自动方式从网站提取和解析数据的过程。这是创建用于研究和学习的数据集的有用技术。虽然网页抓取通常涉及解析和处理 HTML 文档&#xff0c;但某些平台还提供 REST API 来以机器可读格式&#xff08;如 JSON&#xff09;检…...

这10款类似Stable Diffusion的ai绘图软件,你了解多少?

Stable Diffusion这款ai软件有哪些可以替代的软件&#xff1f;好用的类似Stable Diffusion的ai软件推荐&#xff0c;那么今天就跟着赞奇云工作站小编一起来看看吧。 什么是Stable Diffusion&#xff1f; 称为“Stable Diffusion”的文本到图像模型可以将任何文本转换为逼真、…...

部署ik分词器

部署ik分词器 案例版本&#xff1a;elasticsearch-analysis-ik-8.6.2 ​ ES默认自带的分词器对中文处理不够友好&#xff0c;创建倒排索引时可能达不到我们想要的结果&#xff0c;然而IK分词器能够很好的支持中文分词 ​ 因为是集群部署&#xff0c;所以每台服务器中的ES都需…...

基于STM32+华为云IOT设计的智能垃圾桶

一、项目介绍 在商业街、小吃街和景区等人流密集的场所&#xff0c;垃圾桶的及时清理对于提供良好的游客体验至关重要。然而&#xff0c;传统的垃圾桶清理方式通常是定时或定期进行&#xff0c;无法根据实际情况进行及时响应&#xff0c;导致垃圾桶溢满&#xff0c;影响环境卫…...

板子接线图

1.ST-LINK V2接线 2.对抗板子刷蓝牙固件 接USB转TTL&#xff0c;用镊子短接两个孔 2.对抗板子用串口测试蓝牙AT命令 短接白色箭头&#xff0c;接TX&#xff0c;RX&#xff0c;电源...

Python练习之选择与循环

目录 1、编写程序&#xff0c;运行后用户输入4位整数作为年份&#xff0c;判断其是否为闰年。提示&#xff1a;如果年份能被400整除&#xff0c;则为闰年&#xff1b;如果年份能被4整除但不能被100整除也为闰年。2、编写程序&#xff0c;用户从键盘输入小于 1000 的整数&#x…...

MySQL5.7开启通用日志功能

起因&#xff1a; 因项目数据库占用异常&#xff0c;查询数据库有哪些IP地址连接使用&#xff08;Windows环境下&#xff09;。 操作步骤&#xff1a; 1、修改MySQL服务的my.ini 文件 # 开启通用查询日志 general_log 1 log_output …...

WPF控件模板

在过去&#xff0c;Windows开发人员必须在方便性和灵活性之间做出选择。为得到最大的方便性&#xff0c;他们可以使用预先构建好的控件。这些控件可以工作的足够好&#xff0c;但可定制性十分有限&#xff0c;并且几乎总是具有固定的可视化外观。偶尔&#xff0c;某些控件提供了…...

vue移动端页面适配

页面的适配&#xff0c;就是一个页面能在PC端正常访问&#xff0c;同时也可以在移动端正正常访问。 现在我们可以通过弹性布局【Flexible布局】、媒体查询和响应式布局。除此之外&#xff0c;还可以通过rem和vw针对性地解决页面适配问题。 响应式布局 响应式布局的核心&…...

Ei Scopus 双检索 |第三届信息与通信工程国际会议国际会议(JCICE 2024)

会议简介 Brief Introduction 2024年第三届信息与通信工程国际会议国际会议(JCICE 2024) 会议时间&#xff1a;2024年5月10日-12日 召开地点&#xff1a;中国福州 大会官网&#xff1a;JCICE 2024-2024 International Joint Conference on Information and Communication Engin…...

ChatGPT实战-Embeddings打造定制化AI智能客服

本文介绍Embeddings的基本概念&#xff0c;并使用最少但完整的代码讲解Embeddings是如何使用的&#xff0c;帮你打造专属AI聊天机器人&#xff08;智能客服&#xff09;&#xff0c;你可以拿到该代码进行修改以满足实际需求。 ChatGPT的Embeddings解决了什么问题&#xff1f; …...

C语言指针,深度长文全面讲解

指针对于C来说太重要。然而&#xff0c;想要全面理解指针&#xff0c;除了要对C语言有熟练的掌握外&#xff0c;还要有计算机硬件以及操作系统等方方面面的基本知识。所以本文尽可能的通过一篇文章完全讲解指针。 为什么需要指针&#xff1f; 指针解决了一些编程中基本的问题。…...

云桌面打开部署在linux的服务特别卡 怎么解决

云桌面打开部署在 Linux 服务器上的服务卡顿可能是由多种因素引起的&#xff0c;包括服务器性能、网络连接、应用程序配置等。以下是一些可能的解决方法&#xff0c;可以帮助您缓解云桌面访问部署在 Linux 服务器上的服务时的卡顿问题&#xff1a; 优化服务器性能&#xff1a; …...

day5ARM

循环点亮三个led灯 方法1 ------------------led.h---------------- #ifndef __LED_H__ #define __LED_H__#define RCC (*(volatile unsigned int *)0x50000A28) #define GPIOE ((GPIO_t *)0x50006000) #define GPIOF ((GPIO_t *)0x50007000)//结构体封装 typedef struct {vo…...

旋转链表-双指针思想-LeetCode61

题目要求&#xff1a;给定链表的头结点&#xff0c;旋转链表&#xff0c;将链表每个节点向右移动K个位置。 示例&#xff1a; 输入&#xff1a;head [1,2,3,4,5], k2 输出&#xff1a;[4,5,1,2,3] 双指针思想&#xff1a; 先用双指针策略找到倒数K的位置&#xff0c;也就是(…...

使用自定义XML配置文件在.NET桌面程序中保存设置

本文将详细介绍如何在.NET桌面程序中使用自定义的XML配置文件来保存和读取设置。除了XML之外&#xff0c;我们还将探讨其他常见的配置文件格式&#xff0c;如JSON、INI和YAML&#xff0c;以及它们的优缺点和相关的NuGet类库。最后&#xff0c;我们将重点介绍我们为何选择XML作为…...

1787_函数指针的使用

全部学习汇总&#xff1a;GitHub - GreyZhang/c_basic: little bits of c. 前阵子似乎写了不少错代码&#xff0c;因为对函数指针的理解还不够。今天晚上似乎总算是梳理出了一点眉目&#xff0c;在先前自己写过的代码工程中做一下测试。 先前实现过一个归并排序算法&#xff0c…...

解决nomachine扫描不出ip问题

IP扫描工具Advanced IP Scanner 快速的扫描局域网中存在ip地址以及pc机的活跃状态&#xff0c;还能列出局域网计算机的相关信息。并且ip扫描工具(Advanced IP Scanner)还能够单击访问更多有用的功能- 远程关机和唤醒 软件下载地址...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

《Offer来了:Java面试核心知识点精讲》大纲

文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...

Python学习(8) ----- Python的类与对象

Python 中的类&#xff08;Class&#xff09;与对象&#xff08;Object&#xff09;是面向对象编程&#xff08;OOP&#xff09;的核心。我们可以通过“类是模板&#xff0c;对象是实例”来理解它们的关系。 &#x1f9f1; 一句话理解&#xff1a; 类就像“图纸”&#xff0c;对…...