【力扣每日一题】力扣2865美丽塔I

题目来源

力扣2865美丽塔I

题目概述

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

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

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

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

解题思路

思路一:遍历一遍数组,假设每个位置为顶峰,分别计算该位置为顶峰时的山脉高度,并记录最大值; 思路二:使用两个数组(栈或者双端队列都行,最好是栈,方便编码)一个记录从左到右递增序列在某个位置的最大高度和,另一个记录从右到左递增序列在某个位置的最大高度和,同一个位置的最大高度和相加就是该位置为顶峰的结果。

代码实现

java实现

public class Solution {public long maximumSumOfHeights(List<Integer> maxHeights) {// 长度int length = maxHeights.size();// 构造一座从左到右逐渐增高的山脉数组int[] rightMaxMountain = new int[length];rightMaxMountain[0] = maxHeights.get(0);// 表示记某个位置为顶峰,从左递增山脉的累计高度long[] rightMaxMountainHeightSum = new long[length];rightMaxMountainHeightSum[0] = rightMaxMountain[0];// 表示已构造山脉长度for (int i = 1; i < length; i++) {// 当前高度int current = maxHeights.get(i);long temp = rightMaxMountainHeightSum[i - 1];// 如果当前高度比已经构造的山高度低,已构造高的部分销毁int tempCount = i ;while (tempCount != 0 && rightMaxMountain[tempCount - 1] > current) {temp -= (rightMaxMountain[tempCount - 1] - current);rightMaxMountain[tempCount - 1] = current;tempCount--;}// 记录最大高度rightMaxMountainHeightSum[i] = temp + (rightMaxMountain[i] = current);}// 构造一座从右到左逐渐增高的山脉数组int[] leftMaxMountain = new int[length];leftMaxMountain[length - 1] = maxHeights.get(length - 1);// 表示记某个位置为顶峰,从右递增山脉的累计高度long[] leftMaxMountainHeightSum = new long[length];leftMaxMountainHeightSum[length - 1] = leftMaxMountain[length - 1];// 结果long result = rightMaxMountainHeightSum[length - 1] + leftMaxMountainHeightSum[length - 1] - maxHeights.get(length - 1);for (int i = length - 2; i >= 0; i--) {// 当前高度int current = maxHeights.get(i);long temp = leftMaxMountainHeightSum[i + 1];// 如果已构造山脉比当前高度高,销毁已构造高的部分int tempCount = i;while (tempCount != length - 1 && current < leftMaxMountain[tempCount + 1]){temp -= (leftMaxMountain[tempCount + 1] - current);leftMaxMountain[tempCount + 1] = current;tempCount++;}// 记录最大高度leftMaxMountainHeightSum[i] = temp + (leftMaxMountain[i] = current);result = Math.max(result, leftMaxMountainHeightSum[i] + rightMaxMountainHeightSum[i] - current);}return result;}
}

c++实现

class Solution {
public:long long maximumSumOfHeights(vector<int>& maxHeights) {// 长度int length = maxHeights.size();// 构造一座从左到右逐渐增高的山脉数组int* rightMaxMountain = new int[length];rightMaxMountain[0] = maxHeights[0];// 表示记某个位置为顶峰,从左递增山脉的累计高度long long* rightMaxMountainHeightSum = new long long[length];rightMaxMountainHeightSum[0] = rightMaxMountain[0];// 表示已构造山脉长度for (int i = 1; i < length; i++) {// 当前高度int current = maxHeights[i];long temp = rightMaxMountainHeightSum[i - 1];// 如果当前高度比已经构造的山高度低,已构造高的部分销毁int tempCount = i;while (tempCount != 0 && rightMaxMountain[tempCount - 1] > current) {temp -= (rightMaxMountain[tempCount - 1] - current);rightMaxMountain[tempCount - 1] = current;tempCount--;}// 记录最大高度rightMaxMountainHeightSum[i] = temp + (rightMaxMountain[i] = current);}// 构造一座从右到左逐渐增高的山脉数组int* leftMaxMountain = new int[length];leftMaxMountain[length - 1] = maxHeights[length - 1];// 表示记某个位置为顶峰,从右递增山脉的累计高度long long* leftMaxMountainHeightSum = new long long[length];leftMaxMountainHeightSum[length - 1] = leftMaxMountain[length - 1];// 结果long long result = rightMaxMountainHeightSum[length - 1] + leftMaxMountainHeightSum[length - 1] - maxHeights[length - 1];for (int i = length - 2; i >= 0; i--) {// 当前高度int current = maxHeights[i];long temp = leftMaxMountainHeightSum[i + 1];// 如果已构造山脉比当前高度高,销毁已构造高的部分int tempCount = i;while (tempCount != length - 1 && current < leftMaxMountain[tempCount + 1]) {temp -= (leftMaxMountain[tempCount + 1] - current);leftMaxMountain[tempCount + 1] = current;tempCount++;}// 记录最大高度leftMaxMountainHeightSum[i] = temp + (leftMaxMountain[i] = current);long long newResult = leftMaxMountainHeightSum[i] + rightMaxMountainHeightSum[i] - current;result = result > newResult ? result : newResult;}return result;}
};

算法题记录

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

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

相关文章

翻译: GPT-4 with Vision 升级 Streamlit 应用程序的 7 种方式一

随着 OpenAI 在多模态方面的最新进展&#xff0c;想象一下将这种能力与视觉理解相结合。 现在&#xff0c;您可以在 Streamlit 应用程序中使用 GPT-4 和 Vision&#xff0c;以&#xff1a; 从草图和静态图像构建 Streamlit 应用程序。帮助你优化应用的用户体验&#xff0c;包…

《合成孔径雷达成像算法与实现》Figure5.18

clc clear close all距离向参数 R_eta_c 20e3; % 景中心斜距 Tr 25e-6; % 发射脉冲时宽 Kr 0.25e12; % 距离向调频率 Fr 7.5e6; % 距离向采样率 Nrg 256; % 距离线采样点数 Bw abs(Kr*Tr); …

Redis面试题35

什么是大数据&#xff1f;它有哪些应用场景&#xff1f; 答&#xff1a;大数据&#xff08;Big Data&#xff09;是指规模庞大、复杂多样的数据集合&#xff0c;以及从这些数据中提取、分析和运用的技术和方法。 大数据的特点主要包括3V&#xff1a;Volume&#xff08;大量&…

.NET绿色开源一键自动化下载、安装、激活Office的利器

前言 今天分享一款.NET开源、绿色、安全、无毒的支持一键自动化下载、安装、激活Microsoft Office的利器&#xff1a;LKY_OfficeTools。 工具介绍 一键自动化下载、安装、激活 Microsoft Office 的利器。绿色、开源、安全、无毒。 目前包含的功能&#xff1a; 一键快速下载、…

【机器学习300问】16、逻辑回归模型实现分类的原理?

在上一篇文章中&#xff0c;我初步介绍了什么是逻辑回归模型&#xff0c;从它能解决什么问题开始介绍&#xff0c;并讲到了它长什么样子的。如果有需要的小伙伴可以回顾一下&#xff0c;链接我放在下面啦&#xff1a; 【机器学习300问】15、什么是…

C#,计算几何,二维贝塞尔拟合曲线(Bézier Curve)参数点的计算代码

Pierre Bzier Bzier 算法用于曲线的拟合与插值。 插值是一个或一组函数计算的数值完全经过给定的点。 拟合是一个或一组函数计算的数值尽量路过给定的点。 这里给出 二维 Bzier 曲线拟合的参数点计算代码。 区别于另外一种读音接近的贝塞耳插值算法&#xff08;Bessels int…

【CAD全套教程】第1阶段 CAD软件教程 002+003基础界面设置

002基础界面设置 1.切换界面至AutoCAD经典界面 方式一&#xff1a;任务栏点击后直接选择 方式二&#xff1a;右下角点击齿轮图标&#xff08;切换工作空间&#xff09;后直接选择 界面图 2.AutoCAD常用命令 工具栏右键单击&#xff0c;选择AutoCAD 3.命令提示行 最下方&#xf…

【Docker】实现JMeter分布式压测

一个JMeter实例可能无法产生足够的负载来对你的应用程序进行压力测试。如本网站所示&#xff0c;一个JMeter实例将能够控制许多其他的远程JMeter实例&#xff0c;并对你的应用程序产生更大的负载。JMeter使用Java RMI[远程方法调用]来与分布式网络中的对象进行交互。JMeter主站…

【前端web入门第二天】01 html语法实现列表与表格_合并单元格

html语法实现列表与表格 文章目录: 1.列表 1.1 无序列表1.2 有序列表1.3 定义列表 2.表格 2.1 表格基本结构2.2 表格结构标签2.3 合并单元格 写在最前,第二天学习目标: 列表 表格 表单 元素为嵌套关系 1.列表 作用:布局内容排列整齐的区域。 列表分类:无序列表、有序列表…

数字IC实践项目(8)—CNN加速器(ASIC_Flow;付费项目补充)

数字IC实践项目&#xff08;8&#xff09;—CNN加速器&#xff08;ASIC_Flow&#xff1b;付费项目补充&#xff09; 更新说明项目整体框图神经网络框图File tree 项目简介和学习目的软件环境要求 Area、QOR、Power&Timing报告Area & QORTiming & Power 总结 更新说…

数据结构和线程池

1.List List<String> list new ArrayList<>(); 并发读写时&#xff0c;会抛出异常&#xff08;Java.util.ConcurrentModificationException&#xff09; new vector<>(); 读写操作都加了锁&#xff0c;但性能不理想 new CopyOnWriteArrayList<>(); 并…

【C++】类与对象(一)

前言 类与对象&#xff08;一&#xff09; 文章目录 一、面向对象和面向过程的对比二、类的引入2.1 C中的结构体2.2 类2.3 类定义方法2.4 修饰限定符2.5 封装2.6 类的实例化2.7 类对象的大小 三、this指针3.1 this 指针的使用 一、面向对象和面向过程的对比 面向过程编程是将程…

代码随想录算法训练营第四十六天 | 139.单词拆分、多重背包

139.单词拆分 题目链接&#xff1a;139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 文章讲解/视频讲解&#xff1a;https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88…

Codeforces Round 921 (Div. 2) (C贪心 D期望数学? E线段树)

A&#xff1a; 长度最小就是每k个小写字母形成一组&#xff0c;这样能保证最短的拥有全部子序列 #include<bits/stdc.h> using namespace std; const int N 1e610,M2*N,mod998244353; #define int long long typedef long long LL; typedef pair<int, int> PII;…

GoJS—交互式图表开发的神器(海量案例)

一、GoJS是什么&#xff1a; GoJS是一个用于创建交互式可视化图表和图形的JavaScript库。它提供了丰富的功能和工具&#xff0c;使开发人员能够轻松地构建各种类型的图表&#xff0c;包括流程图、组织结构图、网络拓扑图等。GoJS具有灵活的布局和样式设置&#xff0c;可以通过简…

新概念英语第二册(43)下

【Key structures】Can and Be able to 情态助动词 can/could 用于表示请求别人允许或答复时的情况: Can/Could I borrow you pen? can 有时可以表示可能性&#xff1a; I can have lunch with your tomorrow if you like. 在表示天生的或学到的能力时&#xff0c;can/could 可…

Python中Numba库装饰器

一、运行速度是Python天生的短板 1.1 编译型语言&#xff1a;C 对于编译型语言&#xff0c;开发完成以后需要将所有的源代码都转换成可执行程序&#xff0c;比如 Windows 下的.exe文件&#xff0c;可执行程序里面包含的就是机器码。只要我们拥有可执行程序&#xff0c;就可以随…

基于STM32的智能手环设计与实现

需要原理图工程&#xff0c;源码&#xff0c;PCB工程的朋友收藏&#xff0c;这篇文章关注我&#xff0c;私我吧&#xff01;&#xff01;&#xff01; 基于STM32的智能手环设计与实现 摘要一、研究背景及意义二、实现功能三、系统方案设计系统方案设计框图3.1 单片机芯片选择3…

getCookie(key)网页JS获取COOKE一项值

这里讲解一下获取document.cookie里面的指定项目值的两种方法&#xff1a; 第一种&#xff1a; let allcookies document.cookie; function getCookie(cookie_name) {var allcookies document.cookie;var cookie_pos allcookies.indexOf(cookie_name); //索引的长度// 如…

[HGAME 2023 week1]easyenc

查壳 IDA打开 字符串打开就发现了明显的标志 int __cdecl main(int argc, const char **argv, const char **envp) {__int64 v3; // rbx__int64 v4; // raxchar v5; // alchar *v6; // rcxint v8[10]; // [rsp20h] [rbp-19h]char v9; // [rsp48h] [rbpFh]__int128 v10[3]; //…