LC 2865. 美丽塔 I

2024-01-25 03:04
文章标签 lc 美丽 2865

本文主要是介绍LC 2865. 美丽塔 I,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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 <= n == maxHeights <= 10^3
  • 1 <= maxHeights[i] <= 10^9

示例 1:

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

分析

根据数据范围可以知道时间复杂度要控制在 O ( n 2 l o g n ) O(n^2logn) O(n2logn),首先我们要确定这个山脉的中心,也就是说我们可以枚举这个中心,然后去构造这个山脉数组,至于怎么构造,因为确定了中心,所以我们可以枚举左右两边,以左边为例,我们要所得的山脉的高度之和最大,所以我们要尽可能取到最大的山脉高度,也就是说,如果当前山脉的最大高度小于等于右边山脉的高度,我们就可以直接取最大的高度,如果比右边的高度高,那么就只能取和右边的山脉相同的高度,右边是同理的,注意数据范围可能爆int,所以注意开long long

暴力枚举

class Solution {
public:using LL = long long;long long maximumSumOfHeights(vector<int>& maxHeights) {int n = maxHeights.size();LL res = 0;for (int i = 0; i < n; i ++){LL sum = maxHeights[i];LL t = maxHeights[i];// 用t表示当前山脉的限制高度for (int j = i - 1; j >= 0; j --)if (maxHeights[j] <= t) sum += maxHeights[j], t = maxHeights[j];else sum += t;t = maxHeights[i];for (int j = i + 1; j < n; j ++)if (maxHeights[j] <= t) sum += maxHeights[j], t = maxHeights[j];else sum += t;res = max(res, sum);}return res;}
};

时间复杂度 O ( n 2 ) O(n^2) O(n2)

分析

我们确定山峰之后,分析左边,从山峰往左看,根据上面的暴力做法的提示,我们发现,假设当前的山峰maxHeightx,那么如果左边的山脉是高于x的,左边的山脉就会受到限制,那么这个限制什么时候解除呢,碰到一个比x还要小的山脉,而且是第一个,那么我们就可以联想到单调栈的思想,我们可以存下标,我们首先找到受x限制的那一段,终点下标就是栈顶假设是t,那么这一段全部都是x高度,我们定义l[i]表示当前位置为山峰,从i往左看非递增的山脉的高度值和,假设l[i] = l[t] + (i - t) * x(下标从1开始),考虑边界情况,如果左边没有比x小的,那么左边都要受到限制,所以我们可以将栈底始终放一个下标0,这样就方便处理,至于右边的情况,是一样的,我们可以将数组反转一下,然后就是相同的处理

单调栈

class Solution {
public:using LL = long long;long long maximumSumOfHeights(vector<int>& maxHeights) {int n = maxHeights.size();vector<LL> l(n + 1), r(n + 1); // 下标从1开始方便处理边界auto f = [&](vector<LL>& g) {stack<LL> stk;stk.push(0); // 方便处理边界for (int i = 1; i <= n; i ++ ) {while (stk.size() > 1 && maxHeights[stk.top() - 1] >= maxHeights[i - 1]) stk.pop();g[i] = g[stk.top()] + (LL)(i - stk.top()) * maxHeights[i - 1];stk.push(i);}};f(l), reverse(maxHeights.begin(), maxHeights.end()), f(r);LL res = 0;for (int i = 1; i <= n; i ++) {res = max(res, l[i] + r[n - i + 1] - maxHeights[n - i]); // 注意此时数组已经反转了,所以下标要注意}return res;}
};

时间复杂度: O ( n ) O(n) O(n)

结束了

这篇关于LC 2865. 美丽塔 I的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/641890

相关文章

【python 数据可视化】美丽漂亮的画图神器--pyecharts

今天我们介绍下pyechats 的用法和一个简单的例子。 安装: pip install pyecharts 步骤1:导入相关包: # 导入包import pandas as pdfrom pyecharts.charts import *from pyecharts import options as optsfrom pyecharts.globals import *f

从实验室到应用:LC-MS/MS技术与AbMole化合物共舞,揭开半胱氨酸靶向共价抑制剂的新篇章

在生物化学的广阔舞台上,共价抑制剂作为一类特殊的分子“捕手”,它们通过形成稳定的共价键精准捕获目标蛋白的半胱氨酸残基,从而调节其功能。近期,一项由澳门科技大学、暨南大学和中国科学院神经科学研究所携手完成的研究,利用先进的LC-MS/MS技术,结合AbMole BioScience Inc提供的高品质化合物,成功筛选出多种潜在的半胱氨酸靶向共价抑制剂,为科学界带来了一场激动人心的发现之旅。 共价抑

LC开源电路的学习(一)

TI的升压芯片,电压虽然能升高,但是带来的问题就是最大电流大幅降低: CC1和CC2芯片接快充芯片之后,直接接到单片机的下载口: 这个有点意思,用导线换电阻: 、 PD快充芯片CH224K需要连接typeC的DP DN引脚,但是我想用这两个引脚接ch340给单片机下载程序怎么弄:

【LC刷题】DAY15:654 617 700 98

【LC刷题】DAY15:654 617 700 98 文章目录 【LC刷题】DAY15:654 617 700 98654. 最大二叉树 [link](https://leetcode.cn/problems/maximum-binary-tree/description/)617. 合并二叉树 [link](https://leetcode.cn/problems/merge-two-b

【Rust 日报】2021-04-22 Rust语言因为社区温暖而美丽

让Rust拥有更高生产力 RustConf 2020 讲座 讲师是jam1garner。 讲座简介:可以说,Rust中的宏系统仍处于起步阶段。尽管已经完成了很多实现,但是由于宏编程的资源有限,因此许多项目无法正确利用宏。本讲座的目的是向有兴趣在现有或将来项目中使用宏的人员介绍能将项目带入新高度所需的宏惯用法。(机翻,除了冗长没啥毛病 :) ) About More: https://meetup

仿中波本振电路的LC振荡器电路实验

手里正好有一套中波收音机套件的中周。用它来测试一下LC振荡器,电路如下: 用的是两只中频放大的中周,初步测试是用的中周自带的瓷管电容,他们应该都是谐振在465k附近。后续测试再更换电容测试。 静态电流,0.5到1mA。下面记录下测试的一些情况: 1. 起振幅度小,如果0-300M看频谱,在50M后面会出现拱起,所以这个实际电路需要抑制这些信号。当然我用的是面包板,可能跟面包板的分布参数有

LANG、LC_MESSAGES和LC_ALL

在Linux系统中,环境变量LANG、LC_MESSAGES和LC_ALL用于控制系统和应用程序的语言和区域设置(locale)。它们的具体作用如下: LANG:         LANG是最基本的环境变量,用于指定系统的默认语言和区域设置。它是一个全局变量,当其他更具体的区域变量(如LC_MESSAGES)未设置时,系统会使用LANG的值。         例如:expor

【Leetcode】2663. 字典序最小的美丽字符串

题目 题目链接🔗如果一个字符串满足以下条件,则称其为 美丽字符串 : 它由英语小写字母表的前 k 个字母组成。它不包含任何长度为 2 或更长的回文子字符串。 给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。请你找出并返回一个长度为 n 的美丽字符串,该字符串还满足:在字典序大于 s 的所有美丽字符串中字典序最小。如果不存在这样的字符串,则返回一个空字符串。对于长度相同的两个字

2748. 美丽下标对的数目(Rust暴力枚举)

题目 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length ,如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 ,则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回 nums 中 美丽下标对 的总数目。 对于两个整数 x 和 y ,如果不存在大于 1 的整数可以整除它们,

Day 28:2748. 美丽下标对的数目

Leetcode 2748. 美丽下标对的数目 给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length ,如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 ,则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。 返回 nums 中 美丽下标对 的总数目。 对于两个整数 x 和 y ,