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

题目来源

力扣2865美丽塔I

题目概述

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

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

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

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

解题思路

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

代码实现

java实现

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++实现

cpp 复制代码
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;
    }
};

算法题记录

相关推荐
zcg19423 分钟前
图像分割——常用数据和算法
算法
子午5 分钟前
基于YOLO的车牌识别检测~Python+YOLOV8算法+车牌定位+车牌检测+深度学习
python·算法·yolo
梓䈑8 分钟前
【Linux网络】构建UDP网络服务:从Echo到聊天室的线程池架构演进
linux·网络·c++·udp
heimeiyingwang12 分钟前
【架构实战】分布式ID生成:雪花算法与业务ID设计
分布式·算法·架构
学会去珍惜12 分钟前
C++如何与C语言混合编程_在C++项目中调用C库函数的extern “C“方法
c语言·c++·混合编程·extern
无聊的老谢12 分钟前
编译期即正义:利用 Java Lambda 构建类型安全的 SQL 表达式引擎
java·开发语言
十五年专注C++开发14 分钟前
QHttp: 一个开源的轻量级、异步、高性能 HTTP 库
c++·qt·网络协议·http·qhttp
小小de风呀16 分钟前
de风——【从零开始学C++】(八):string的模拟实现
开发语言·c++
代码中介商17 分钟前
排序算法完全指南(一):冒泡排序深度详解
算法·排序算法
疯狂成瘾者18 分钟前
Elasticsearch 是什么?它和普通数据库查询有什么区别?
java