[python 刷题] 2866 Beautiful Towers II

[python 刷题] 2866 Beautiful Towers II

题目如下:

You are given a 0-indexed array maxHeights of n integers.

You are tasked with building n towers in the coordinate line. The ith tower is built at coordinate i and has a height of heights[i].

A configuration of towers is beautiful if the following conditions hold:

  1. 1 <= heights[i] <= maxHeights[i]
  2. heights is a mountain array.

Array heights is a mountain if there exists an index i such that:

  • For all 0 < j <= i, heights[j - 1] <= heights[j]
  • For all i <= k < n - 1, heights[k + 1] <= heights[k]

Return the maximum possible sum of heights of a beautiful configuration of towers.

这个 mountain 的定义,其实图解一下就很好理解了:

  1. 在这里插入图片描述

    这是一个极端案例,另一个极端案例就是 ⛰️ 的顶端在末尾,整个数组都是呈上升趋势

  2. 在这里插入图片描述

  3. 在这里插入图片描述

提炼一下就是,数组的结构大致如下:

在这里插入图片描述

也就是说:

  • 存在 [ 0 , . . . , j − 1 , j ] [0, ..., j - 1, j] [0,...,j1,j] 的区间,其中 n u m s [ j ] ≥ n u m s [ j − 1 ] ≥ . . . ≥ n u m s [ 0 ] nums[j] \ge nums[j - 1] \ge ... \ge nums[0] nums[j]nums[j1]...nums[0],其中 j > 0 j > 0 j>0

  • 存在 [ j , j + 1 , . . . , k ] [j, j + 1, ..., k] [j,j+1,...,k] 的区间,其中 n u m s [ j ] ≥ n u m s [ j + 1 ] ≥ . . . ≥ n u m s [ k ] nums[j] \ge nums[j + 1] \ge ... \ge nums[k] nums[j]nums[j+1]...nums[k],其中 j < = k = l e n ( n u m s ) − 1 j <= k = len(nums) - 1 j<=k=len(nums)1

从图像上来说,这道题其实有点像 84 Largest Rectangle in Histogram,解题思路也是类似的(都是 monotonic stack)

而另一个方面 ,这道题求的又是高度之和,所以又是一个 prefix sum 的变种问题,也因此解题需要将这一部分考虑在其中

完整解题思路如下:

  1. 新建一个 stack 存储遍历过值的下标,新建一个数组存储 l e f t s u m left_sum leftsum 的值

  2. [ 0 , 1 , . . . , l e n ( n u m s ) − 1 ] [0, 1, ..., len(nums) - 1] [0,1,...,len(nums)1] 遍历一遍数组

    每次遍历的过程中都将当前值作为 ⛰️ 的顶点

    因此需要检查 stack 中的值,如果 nums[stack[-1]] 比当前大,就需要将从结果中移除前一座山峰与现在当前高度差

    同时将当前山峰的高度加上去

    完成循环后就能获得 📈 曲线的结果了

  3. [ l e n ( n u m s ) − 1 , l e n ( n u m s ) − 2 , . . . , 1 , 0 ] [len(nums) - 1, len(nums) - 2, ..., 1, 0] [len(nums)1,len(nums)2,...,1,0] 遍历一遍数组

    这是为了获取 ⛰️ 右侧下降的结果

    二者相加,并取最大值就能够获得最终的结果

以第二个 input [6,5,3,9,2,7] 为例跑一遍

  1. 以数组中的第一个值 6 作为山峰

    这里 stack 的值应该是 stack:[0],保存的是下标而不是值

    在这里插入图片描述

  2. 以数组中的第二个值 5 作为山峰

    这时候的山峰是没有前一座山峰高,因此对前一座山进行一下处理。这里处理方式比较粗暴,就是直接把前面的山给挖了,然后通过获取的下标,做一个反向延长,类似于 84 Largest Rectangle in Histogram 的操作。

    最后结果:

    在这里插入图片描述

    这里 stack 中的值更新为正确的下标

  3. 以数组中的第三个值 3 作为山峰

    同样需要反向延长的操作,结果:

    在这里插入图片描述

  4. 以数组中的第四个值 9 作为山峰

    9 作为山峰是可以更高的,因此这里没有对 stack 进行任何一个操作,结果如下:

    在这里插入图片描述

  5. 以数组中的第五个值 2 作为山峰

    在这里插入图片描述

    这里就需要删减两次,最终获得:

    在这里插入图片描述

    stack 我忘了更新了,不过这个循环也用不到 stack 就不补了

  6. 以数组中的最后的值 7 作为山峰

    因为山峰是可以允许作为最高的存在,因此这里不需要做特殊的操作,直接更新 stack 和 left_sum 即可:

    在这里插入图片描述

    stack 我忘了更新了,不过这个循环也用不到 stack 就不补了

到这里, prefix 的处理就做完了,接着反向做 suffix 的处理,逻辑也是一样的,重新初始化 stack 和高度,重新走一遍循环:

  1. 以数组中的最后的值 7 作为山峰,结果如下:

    在这里插入图片描述

    此时的结果为 m a x ( 0 , 17 + 7 − 7 ) max(0, 17 + 7 - 7) max(0,17+77),之所以要 − 7 -7 7 是因为 m a x H e i g h t s [ i ] maxHeights[i] maxHeights[i] 在 prefix 计算添加了一次,suffix 计算也添加了一次

  2. 以数组中的第四个值 7 作为山峰,结果如下:

    在这里插入图片描述

    此时的结果为 m a x ( 17 , 10 + 4 − 2 ) max(17, 10 + 4 - 2) max(17,10+42)

  3. 以数组中的第三个值 9 作为山峰,结果如下:

    在这里插入图片描述

    此时的结果为 m a x ( 17 , 18 + 13 − 9 ) max(17, 18 + 13 - 9) max(17,18+139)

  4. 以此类推…

最终代码如下:

class Solution:def maximumSumOfHeights(self, maxHeights):left_sum = [0 for _ in maxHeights]stack = [] # store [i, h]total = 0for i, h in enumerate(maxHeights):while stack and stack[-1][1] > h:j, j_h = stack.pop()multiplier = j - stack[-1][0] if stack else j + 1# 这里把所有高出当前峰的 ⛰️ 都从结果中扣掉total -= j_h * multiplier# 然后在加回去,这时候 stack 中如果存在值,那一定比当前 ⛰️ 要小# 如果 stack 为空,则代表当前 ⛰️ 可以一直延续到 i = 0multiplier = i - stack[-1][0] if stack else i + 1total += h * multiplierleft_sum[i] = totalstack.append([i, h])stack = []total = 0result = 0# 一个反向求解,从 len(maxHeights) - 1, ..., 0 的方向遍历# 其余操作与第一个 for loop 一致,唯一需要注意的就是这里的下标计算为# [j, j + 1, ..., len(maxHeights)]# 第一个 loop 中为# [0, 1, ..., j]for i in reversed(range(len(maxHeights))):while stack and maxHeights[stack[-1]] > maxHeights[i]:j = stack.pop()multiplier = stack[-1] - j if stack else len(maxHeights) - jtotal -= maxHeights[j] * multipliermultiplier = stack[-1] - i if stack else len(maxHeights) - itotal += maxHeights[i] * multiplierresult = max(result, total + left_sum[i] - maxHeights[i])stack.append(i)return result

讲道理我对 LC 的 rating 不是很理解……Largest Rectangle in Histogram(hard) + prefix sum = medium problem…?

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

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

相关文章

Win YAPI + Jenkins 实现接口自动化测试

自动化测试 传统的接口自动化测试成本高&#xff0c;大量的项目没有使用自动化测试保证接口的质量&#xff0c;仅仅依靠手动测试&#xff0c;是非常不可靠和容易出错的。 为了解决这个问题&#xff0c;使用YAPI接口自动化测试功能&#xff0c;只需要配置每个接口的入参和对 RE…

windows docker desktop 更换镜像 加速

最近 docker hub 访问不了; 经过研究 可以通过添加 代理镜像网址 添加代理服务器的方式 实现完美访问 1添加镜像网站 修改成国内镜像地址就能享受到飞一般的速度&#xff0c;但有一个问题&#xff0c;部分站点镜像不全或者镜像比较老&#xff0c;建议使用多个镜像站。 https…

人工智能与脑机接口:开启人机融合的新时代

人工智能与脑机接口&#xff1a;开启人机融合的新时代 随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;我们正与一个全新的时代相遇——人工智能与脑机接口相融合的时代。这个时代将带来前所未有的变革&#xff0c;让人类与机器的交互方式发生根本性的改变。…

React的useEvent 和 ahooks 的 useMemorizedFn 的深度分析和对比

父组件 const TestParent: React.FC<any> () > {const [State, setState] useState(0);const changeFun useCallback(() > {console.log(useCallback closure 里的 State, State);}, [State]);const changeFun_useEvent useEvent(() > {console.log(useEv…

新工业革命?基于机器视觉技术分拣机器人的未来与发展

原创 | 文 BFT机器人 01 分拣机器人的应用 基于机器视觉技术的分拣机器人可以将工人从繁重的劳动中解放出来&#xff0c;大大提高了分拣的效率&#xff0c;因此被广泛地应用于食品、物流以及煤矿等多个行业。 1.1 分拣机器人在水果分拣中的应用 随着农业科技的发展和人民生活…

MetaAI提出全新验证链框架CoVE,大模型也可以通过“三省吾身”来缓解幻觉现象

​ 论文名称&#xff1a; Chain-of-Verification Reduces Hallucination in Large Language Models 论文链接&#xff1a; https://arxiv.org/abs/2309.11495 曾子曰&#xff1a;“吾日三省吾身” --出自《论语学而》 时至今日&#xff0c;生成幻觉&#xff08;hallucination&…

curl(三)传递数据

一 基础铺垫 ① form表单回顾 关注&#xff1a; from表单涉及method、content-type enctype和Content-type有什么关系 ② Content-Type 思考&#xff1a;数据传输格式和解析类型不一致导致哪些特性? ③ application/x-www-form-urlencoded 1、GET方式 2、POST方式 ④ …

走近Python爬虫(二):常见反爬虫机制的应对措施

文章目录 一、应对—异步加载1.一般措施2.Selenium 二、应对—登录验证1.使用Selenium模拟登录2.使用Cookies登录3.使用Session模拟表单登录 三、应对—验证码 本文是Python爬虫系列博客的第二篇&#xff0c;内容概览如下&#xff1a; 一、应对—异步加载 1.一般措施 AJAX技术…

【JVM经典面试题(五十二道)】

文章目录 JVM经典面试题&#xff08;五十二道&#xff09;引言1.什么是JVM 内存管理2.能说一下JVM的内存区域吗&#xff1f;3.说一下JDK1.6、1.7、1.8内存区域的变化&#xff1f;4.为什么使用元空间替代永久代作为方法区的实现&#xff1f;5.对象创建的过程了解吗&#xff1f;6…

神经网络多种注意力机制原理和代码讲解

多种注意力表格&#xff1a; 大神参考仓库链接&#xff1a; 魔鬼面具 对应 name 就是目录&#xff0c;点击即可跳转到对应学习。 nameneed_chaneelpaper SE (2017) Truehttps://arxiv.org/abs/1709.01507 BAM (2018) Truehttps://arxiv.org/pdf/1807.06514.pdf CBAM (2018) Tr…

Lodash 真的死了吗?Lodash 5 在哪里?

与一些传言相反&#xff0c;Lodash依然活跃&#xff0c;并正在迈向Lodash 5的发布&#xff01; Lodash 是那些为 JavaScript 提供便利功能的实用程序库之一&#xff0c;它使编程变得更加轻松。许多开发者使用它来简化对象和数组的处理。 它也是一个像 Moment.js那样被捕获得措手…

【WSL/WSL 2-Redis】解决Windows家庭版/教育版无法安装WSL Ubuntu子系统与Redis安装

前言 在现代计算环境中&#xff0c;开发人员和技术爱好者通常需要在不同的操作系统之间切换&#xff0c;以便利用各种工具和应用程序。在这方面&#xff0c;Windows用户可能发现WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个强大的工具&#xff0c;它允许他们…

文件上传漏洞实战getshell

目录 0x01 信息收集 0x02 寻找接口 0x03 拼接路径 0x04 权限 0x01 信息收集 通过fofa&#xff0c;子域名收集等相关工具搜索域名 定位到站点&#xff1a;htps://xx..edu.cn/x/xx/ 0x02 寻找接口 通过f12寻找相关的js&#xff0c;发现有其他的页面 0x03 拼接路径 https://xx…

Android开发知识学习——从Retrofit原理来看HTTP

文章目录 Retrofit 使用方法简介Retrofit 源码结构总结扔物线读源码的思路与方式 Retrofit 使用方法简介 导包 implementation com.squareup.retrofit2:retrofit:最新版本创建一个 interface 作为 Web Service 的请求集合&#xff0c;在里面用注解 &#xff08;Annotation&…

jeecg-uniapp 转成小程序的过程 以及报错 uniapp点击事件

uniapp 点击事件 tap: 单击事件 confirm: 回车事件 blur:失去焦点事件 touchstart: 触摸开始事件 touchmove: 触摸移动事件。 touchend: 触摸结束事件。 longpress: 长按事件。 input: 输入框内容变化事件。 change: 表单元素值变化事件。 submit: 表单提交事件。 scroll: 滚动…

“免单优选模式:引爆电商革命,颠覆传统购物体验!“

免单优选模式是一种新型的电商销售模式&#xff0c;其核心理念是通过降低商品售价、设置阶梯式奖励以及利用社交关系链&#xff0c;激发消费者购买欲望&#xff0c;实现销售快速增长。 1、合法合规&#xff0c;不存在多层级奖励。 在免单优选模式中&#xff0c;平台不设置多层…

Maven本地配置获取nexus私服的依赖

场景 Nexus-在项目中使用Maven私服&#xff0c;Deploy到私服、上传第三方jar包、在项目中使用私服jar包&#xff1a; Nexus-在项目中使用Maven私服&#xff0c;Deploy到私服、上传第三方jar包、在项目中使用私服jar包_nexus maven-releases 允许deploy-CSDN博客 在上面讲的是…

Jetcache开启FASTJSON2序列化

为什么要用Jetcache JetCache是一个基于Java的缓存系统封装&#xff0c;它提供统一的API和注解来简化缓存的使用。JetCache比SpringCache更强大的注解&#xff0c;可以原生的支持TTL、两级缓存、分布式自动刷新&#xff0c;还提供了Cache接口用于手工缓存操作。 以前使用红薯…

Android ConstraintLayout分组堆叠圆角ShapeableImageView

Android ConstraintLayout分组堆叠圆角ShapeableImageView <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app"…