956. 最高的广告牌

简介: 比如说在你来到最后数字之前map里面有一个插值是1百万的基线10亿,这说明有一一个集合它{10亿+ 100万},还有集合叫{10亿}。这时候你的一百万进去,正好怼出一个差值为零的来。所以为什么map要记录所有的差值,你不知道后面哪一个奇葩数能拱出大的来,我不知道后面有什么奇葩的数,能让我一个重新插值为季的集合基线变得巨大,不知道,所以我都留着。

文章目录

前言

解题思路

代码

前言

你正在安装一个广告牌,并希望它高度最大。这块广告牌将有两个钢制支架,两边各一个。每个钢支架的高度必须相等。


你有一堆可以焊接在一起的钢筋 rods。举个例子,如果钢筋的长度为 1、2 和 3,则可以将它们焊接在一起形成长度为 6 的支架。


返回 广告牌的最大可能安装高度 。如果没法安装广告牌,请返回 0


来源:力扣(LeetCode)

链接:https://leetcode.cn/problems/tallest-billboard

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


解题思路

定义一个map

key:随意选两个子集产生的差值

在数组没有遍历之前,能够找到两个集合, 空集对空集,差值为0

value:有可能会有多个集合对产生同样的差值,记录产生当前差值那一对较好那一对集合较小的那个



谁的值大,谁是较好的一对

关心谁?基线最高的那个



3出现了,加工出map:在只考虑3的情况下,会有哪些差值产生




我老map是所有可能的集合所有可能的插值中最好的一对。

我新map是考虑了当前数字,对每一个老的集合接近左进右出来的新纪录。

我最终的新map怎么合并?老map和新map中的记录,综台起来,最好的变成新map,继续往下推。

当你推过了所有的数字,最终的map你看差值为0的最好一对就是你要的


为什么map中把所有差值都要记录?

那是因为你后面不知道会遇到什么数字。

举个例子,你最后一个数是一百万, 特别大,极大,它左边的数都没它大,但它是一百万。在来到1百万之前,我这个map千变万化,map中有可能有一 个差值是1百万,基线相当的高。

你遇到最后一个数字的时候,它1百万的差值代表什么?

比如说在你来到最后数字之前map里面有一个插值是1百万的基线10亿,

这说明有一一个集合它{10亿+ 100万},还有集合叫{10亿}。这时候你的一百万进去,

正好怼出一个差值为零的来。

所以为什么map要记录所有的差值,你不知道后面哪一个奇葩数能拱出大的来,

我不知道后面有什么奇葩的数,能让我一个重新插值为季的集合基线变得巨大,

不知道,所以我都留着。


代码

class Solution {

   public int tallestBillboard(int[] rods) {

       HashMap<Integer,Integer> dp=new HashMap<>(),cur;

       dp.put(0,0);

       for(int num:rods){

           if(num!=0){

               cur=new HashMap<>(dp);

               for(int d:cur.keySet()){

                   int diffMore=cur.get(d);

                   dp.put(d + num, Math.max(diffMore, dp.getOrDefault(num + d, 0)));

                   int diffXD=dp.getOrDefault(Math.abs(num-d),0);

                   if(d>=num){

                       dp.put(d-num,Math.max(diffMore+num,diffXD));

                   }else{

                       dp.put(num-d,Math.max(diffMore+d,diffXD));

                   }

               }

           }

       }

       return dp.get(0);

   }

}


目录
相关文章
|
前端开发 Linux 网络安全
kali linux 网络渗透测试学习笔记(一)Nmap工具进行端口扫描
一.利用Nmap扫描网站服务器的端口开放情况首先打开我们的kali linux才做系统,再打开其命令行模式,输入:nmap www.csdn.net 如下图所示:   因此,通过这个结果可以表明csdn上的端口开放了80端口以及443端口吗,这两个端口都十分重要,因为80端口适用于给用户呈现出数据,给用户看网站用的,443端口也是一个比较重要的端口。
2499 0
【全是精华】Token的获取和使用-FastApi版
【全是精华】Token的获取和使用-FastApi版
1443 0
|
网络协议 Windows
解决GitHub Pages制作的个人博客无法访问的问题
最近一段时间应该有很多小伙伴发现自己辛苦做的个人博客无法访问了吧。
|
12月前
|
搜索推荐 安全 网络安全
Discuz! X3.5自带参数防御CC攻击以及原理、开启防CC攻击后不影响搜索引擎收录的方法
Discuz! X3.5自带参数防御CC攻击以及原理、开启防CC攻击后不影响搜索引擎收录的方法
528 2
|
存储 缓存 网络协议
Springboot byte[] 转 MultipartFile ,InputStream 转 MultipartFile
Springboot byte[] 转 MultipartFile ,InputStream 转 MultipartFile
1694 0
|
运维 安全 jenkins
通过Jenkins构建CI/CD实现全链路灰度
本文介绍通过 Jenkins 构建流水线的方式实现全链路灰度功能。
992 87
通过Jenkins构建CI/CD实现全链路灰度
|
JSON 前端开发 JavaScript
如何优雅的写 Controller 层代码?
如何优雅的写 Controller 层代码?
如何优雅的写 Controller 层代码?
|
存储 人工智能 数据中心
阿里云基础设施网络亮相SIGCOMM22 - 可预期网络取得重大突破
阿里云基础设施网络亮相SIGCOMM22 - 可预期网络取得重大突破
阿里云基础设施网络亮相SIGCOMM22 - 可预期网络取得重大突破
|
存储 Android开发
方法:一键把一堆手机号码一次性快速导入手机通讯录
手机是人们日常沟通常用的工具,所以自然就要用到手机里面的通讯录联系。因此我们常要把别人的号码存入到手机通讯录里面,如果只是存五个十个那就动动手指就可以了。但是如果你想存把一个电脑excel表格里面的几百个、几千个、几万个等数量级别的联系人一键导入手机通讯录,显然手动一个个来存入是不现实的。我这里演示,通过借助网上常见的便捷工具软件,金芝号码提取导入助手,代替你手动工作来快速完成这个工作,如何一键把一堆手机号码一次性快速导入手机通讯录,省事省时省力。下面做个操作过程的图文讲解。
4663 0
方法:一键把一堆手机号码一次性快速导入手机通讯录