每日一题 力扣2865 美丽塔Ⅰ

2865. 美丽塔 I

题目描述:

给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。

你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。

如果以下条件满足,我们称这些塔是 美丽 的:

  1. 1 <= heights[i] <= maxHeights[i]
  2. heights 是一个 山脉 数组。

如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山脉 数组:

  • 对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j]
  • 对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= heights[k]

请你返回满足 美丽塔 要求的方案中,高度和的最大值 。

示例 1:

输入:maxHeights = [5,3,4,1,1]
输出:13
解释:和最大的美丽塔方案为 heights = [5,3,3,1,1] ,这是一个美丽塔方案,因为:
- 1 <= heights[i] <= maxHeights[i]  
- heights 是个山脉数组,峰值在 i = 0 处。
13 是所有美丽塔方案中的最大高度和。

示例 2:

输入:maxHeights = [6,5,3,9,2,7]
输出:22
解释: 和最大的美丽塔方案为 heights = [3,3,3,9,2,2] ,这是一个美丽塔方案,因为:
- 1 <= heights[i] <= maxHeights[i]
- heights 是个山脉数组,峰值在 i = 3 处。
22 是所有美丽塔方案中的最大高度和。

示例 3:

输入:maxHeights = [3,2,5,5,2,3]
输出:18
解释:和最大的美丽塔方案为 heights = [2,2,5,5,2,2] ,这是一个美丽塔方案,因为:
- 1 <= heights[i] <= maxHeights[i]
- heights 是个山脉数组,最大值在 i = 2 处。
注意,在这个方案中,i = 3 也是一个峰值。
18 是所有美丽塔方案中的最大高度和。

提示:

  • 1 <= n == maxHeights <= 10^3
  • 1 <= maxHeights[i] <= 10^9

思路:

尝试:贪心,先要找出可以放的最高的位置(可能不止一个);
然后以当前位置为界,向两边遍历,每次遍历需要更新两个内容:
1.如果当前高度和大于目前最大高度和,更换之
2.如果当前遍历位置小于本循环内目前最大限高,把限高换成小的。

代码:

有点问题,待改进

class Solution:def maximumSumOfHeights(self, maxHeights: List[int]) -> int:max_h = max(maxHeights)hill=maxHeights.index(max_h)#这是山峰位置i,j=hill-1,hill+1max_left,max_left_now=0,0max_right,max_right_now=0,0#右侧最大和,以及目前高度height_left,height_right=hill,hill#限高while(i>=0):#往左遍历max_left+=min(height_left,maxHeights[i])#左侧高度和height_left=min(height_left,maxHeights[i])i-=1while j < len(maxHeights) :max_right+=min(height_right,maxHeights[j])#右侧高度和height_right=min(height_right,maxHeights[j])j+=1return max_h+max_left+max_right

问题在于,当峰值不唯一时存在问题,因此还是要按照遍历的方式,双重循环去做;或者想办法,找出所有的峰值点,然后依次进行遍历,对每次遍历得到的最大高度进行比较。

换一个:

class Solution:def maximumSumOfHeights(self, maxHeights: List[int]) -> int:n = len(maxHeights)res = 0for i in range(n):pre, psum = maxHeights[i], maxHeights[i]for j in range(i - 1, -1, -1):pre = min(pre, maxHeights[j])psum += presuf = maxHeights[i]for j in range(i + 1, n):suf = min(suf, maxHeights[j])psum += sufres = max(res, psum)return res

其他思路:单调栈的思路

暴力法的思路是从山峰向两侧去构造一个高度之和最大的山脉数组,那么我们能否实现一个从两侧向山峰去构造这个高度之和最大的山脉数组呢?

不妨先考虑构造山峰的左侧,我们自左向右遍历 maxHeights[],对于 nums[i]:
若maxHights[i]>=nums[i-1],则 nums[i] 最高可以取到 maxHeights[i],为了使得高度之和最大,我们不妨贪心的就先令 nums[i]=maxHights[i]
否则,说明 nums[i-1] 太高了,为了使得高度之和最大,我们不妨贪心的令 nums[i-1] = maxHights[i]。同样的,当 nums[i-1] 的高度发生变化后,我们还要继续去判断 nums[i-2] nums[i-3] , ... 的高度是否需要变化
从上述分析中不难看出,在我们自左向右构造山峰的左侧时,需要经常出现 「回退」,因此这里我们可以考虑用一个栈来辅助实现这一过程:

初始时向栈中添加 0 作为边界条件
如果 maxHeights[i]>= 栈顶元素,则说明我们可以直接令 nums[i] 为 maxHights[i]
否则我们需要回去修改之前的高度,不断弹出栈中的元素,直至 maxHights[i]>= 栈顶元素
当遍历到 i 后,我们便构造出了山脉的左侧

显然根据上述的思路,如果我们在 i 的基础上继续遍历到 i+1,就可以构造出以 i+1 为山峰的山脉数组的左侧,因此这启发我们用两个数组 pre,suf 来分别记录以 i 为山峰时的左右两侧的高度之和(pre[i]=sum{nums[0:i]},suf[i]=sum{nums[i:n-1]})。这样之后只要再遍历一次,取最大的 pre[i]+suf[i]-maxHights[i] 即可。

class Solution {typedef pair<size_t,int> PSI;
public:long long maximumSumOfHeights(vector<int>& maxHeights) {const size_t n = maxHeights.size();stack<PSI> st;st.emplace(-1, 0);    // 哨兵vector<long long> mark(n);long long sum = 0;for( size_t i = 0; i < n; ++i ) {while( st.top().second > maxHeights[i] ) {auto [j,h] = st.top();st.pop();sum -= (h-maxHeights[i])*(j-st.top().first);}st.emplace(i, maxHeights[i]);mark[i] = sum;sum += maxHeights[i];}st = stack<PSI>();st.emplace(n, 0);       // 哨兵sum = 0;long long ans = 0;for( int i = n-1; i >= 0; --i ) {while( st.top().second > maxHeights[i] ) {auto [j,h] = st.top();st.pop();sum -= (h-maxHeights[i])*(st.top().first-j);}st.emplace(i, maxHeights[i]);sum += maxHeights[i];ans = max(ans, sum+mark[i]);}return ans;}
};

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

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

相关文章

QT笔记 - QToolButton triggered(QAction *)不触发问题

QToolButton 有两个功能&#xff0c;一个是基本按钮功能&#xff0c;同QPushButton一样&#xff0c;发出clicked()信号。 另一个功能是QAction功能&#xff0c;发出触发triggered(QAction *)信号&#xff0c;但它自己不包含QAction&#xff0c;需要同其它比如QMenu或QToolBar上…

深度解析单片机:历史、发展与您关心的问题

什么是单片机&#xff1f; 定义&#xff1a;单片机是一种集成了中央处理器&#xff08;CPU&#xff09;、内存和外设功能的微型计算机系统。与传统计算机相比&#xff0c;单片机通常集成在一个芯片上&#xff0c;用于控制特定的应用。#单片机# 特点&#xff1a; 封装紧凑&…

人工智能:更多有用的 Python 库

目录 前言 推荐 JupyterLab 入门 复杂的矩阵运算 其它人工智能和机器学习的 Python 库 前言 在这篇文章中&#xff0c;我们将了解更多的矩阵操作&#xff0c;同时再介绍几个人工智能 Python 库。 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#x…

再谈Android View绘制流程

一&#xff0c;先思考何时开始绘制 笔者在这里提醒读者&#xff0c;Android的View是UI的高级抽象&#xff0c;我们平时使用的XML文件也好&#xff0c;本质是设计模式中的一种策略模式&#xff0c;其View可以理解为一种底层UI显示的Request。各种VIew的排布&#xff0c;来自于开…

如何使用 dotnet pack 打包 .NET 跨平台程序集?

如何使用 dotnet pack 打包 .NET 跨平台程序集&#xff1f; dotnet pack 介绍官方描述 dotnet pack 命令说明使用示例打包 .net 类库项目生成带注释的 nuget 包构建特定平台的 nuget 包关于 .NET RID 目录 dotnet pack 介绍 dotnet pack 是一个 .NET Core NuGet 包打包程序。 …

OPenCv基础代码

import numpy as np import cv2 as cv import matplotlib.pyplot as plt#读取图像cv.imread()#读取图像cv.imshow()#绘制直线 cv.line(img,start,end,color,thickness)#绘制圆形 cv.circle(img,centerpoint, r, color, thickness)#绘制矩形 cv.rectangle(img,leftupper,rightdo…

Python 数据分析实战——为什么销售额减少?酒卷隆治_案例1

# 为什么黑猫游戏的销售额会减少&#xff1f; # 数据集 DAU : 每天至少来访问一次的用户数据 数据内容 数据类型 字段名 访问时间 string&#xff08;字符串&#xff09; log_data 应用名称 string&#xff08;字符串&#xff09; app_name 用户 ID int&#xff08;数值&…

【机组】基于FPGA的32位算术逻辑运算单元的设计(EP2C5扩充选配类)

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 一、实验目的 二、实验要求 …

acwing 质数 约数 欧拉函数

目录 质数试除法定质数分解质因数筛质数 约数试除法求约数乘积的约数个数最大公约数 欧拉函数筛法求欧拉函数和 质数 试除法定质数 bool is_prime(int num) {if(num < 2)return false;for(int i 2; i < num / i; i)if(num % i 0)return false;return true; }分解质因…

Javaweb之SpringBootWeb案例之阿里云OSS服务集成的详细解析

2.3.3 集成 阿里云oss对象存储服务的准备工作以及入门程序我们都已经完成了&#xff0c;接下来我们就需要在案例当中集成oss对象存储服务&#xff0c;来存储和管理案例中上传的图片。 在新增员工的时候&#xff0c;上传员工的图像&#xff0c;而之所以需要上传员工的图像&…

<蓝桥杯软件赛>零基础备赛20周--第18周--动态规划初步

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

ASP.NET 7 Core Web 读取appsetting.json

把一些配置信息保存在json文件可以避免更改时要重新发布程序的烦恼。 我这里使用的是写一个类文件&#xff0c;然后通过program.cs启动的方式&#xff08;.net 6 开始没有startup了&#xff09;。 项目类型&#xff1a;ASP.NET Core Web MVC / .NET 7.0 / VS2022 第一步…

基于机器学习的地震预测(Earthquake Prediction with Machine Learning)

基于机器学习的地震预测&#xff08;Earthquake Prediction with Machine Learning&#xff09; 一、地震是什么二、数据组三、使用的工具和库四、预测要求五、机器学习进行地震检测的步骤六、总结 一、地震是什么 地震几乎是每个人都听说过或经历过的事情。地震基本上是一种自…

锂电池基本知识与设计

应用&#xff1a;笔记本电脑、智能手机等设备。 优点&#xff1a;较高能量密度和较长使用寿命&#xff0c;放电率低&#xff0c;可进一步延长充电间隔时间。 缺点&#xff1a;过度充电或者放电会产生不可逆的损伤&#xff0c;性能降低。高温环境下容易爆炸或者着火。 &#x…

el-tree基础的树形节点设置节点不能选中高亮出来,对已经选中的节点设置disabled,对当前节点刚选中后设置禁用disabled

一、 el-tree基础的树形节点设置节点不能选中高亮出来 需求 我们使用element-ui或者element-plus的时候会遇到树形控件的使用&#xff0c;我们使用树形控件会限制有的节点不让选中和高亮出来&#xff0c;这个时候需要我们做限制。在实现中我们发现了element-ui和element-plus…

WSL2+ubuntu 18+VsCode 配置C/C++开发环境 踩坑

1. 管理员模式打开cmd&#xff0c;或PowerShell &#xff0c;输入 wsl --install 可能出现的错误&#xff1a;无法解析服务器名称或地址 解决方式&#xff1a;科学上网 安装WSL时遇到“无法解析服务器名称或地址”的错误及解决方法 - 知乎 错误2&#xff1a;Error 0x8037…

CAD-autolisp——目录

目录页 写在前面&#xff1a;如果仅是想制作小工具&#xff0c;工具集这种&#xff0c;优先学习autolisp&#xff0c;如果想制作3d3s这种大型项目&#xff0c;或者包含大量计算&#xff0c;数据接力&#xff0c;网络通讯等功能&#xff0c;优先学习arx传送门 CAD-autolisp&…

Python tkinter (6) Listbox

Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…

TPCC-MySQL

简介 TPC-C是专门针对联机交易处理系统&#xff08;OLTP系统&#xff09;的规范&#xff0c;一般情况下我们也把这类系统称为业务处理系统。 Tpcc-mysql是percona基于TPC-C(下面简写成TPCC)衍生出来的产品&#xff0c;专用于MySQL基准测试。其源码放在launchpad上&#xff0c…

Python语言入门到精通之练习实例2:企业发放的奖金根据利润提成的问题

题目&#xff1a;企业发放的奖金根据利润提成。利润(I)低于或等于10万元时&#xff0c;奖金可提10%&#xff1b;利润高于10万元&#xff0c;低于20万元时&#xff0c;低于10万元的部分按10%提成&#xff0c;高于10万元的部分&#xff0c;可提成7.5%&#xff1b;20万到40万之间时…