2866. 美丽塔 II --力扣 --JAVA

简介: 给你一个长度为 n 下标从 0 开始的整数数组 maxHeights 。你的任务是在坐标轴上建 n 座塔。第 i 座塔的下标为 i ,高度为 heights[i] 。如果以下条件满足,我们称这些塔是 美丽 的:1 <= heights[i] <= maxHeights[i]heights 是一个 山脉 数组。如果存在下标 i 满足以下条件,那么我们称数组 heights 是一个 山脉 数组:对于所有 0 < j <= i ,都有 heights[j - 1] <= heights[j]对于所有 i <= k < n - 1 ,都有 heights[k + 1] <= he

 题目

给你一个长度为 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. 将列表转换成数组,方便读取数据;
        2. 假设所有节点都可以作为最高峰:
          1. 当前节点小于下一节点则跳过当前节点直接使用下个节点作为最高峰;
          2. 当前节点小于等于上一节点,则当前节点的高度和一定小于等于上一节点,跳过当前节点。
            1. 以当前节点为最高峰向左右边界遍历,返回最大的高度和。

            代码展示

            class Solution {
                public long maximumSumOfHeights(List<Integer> maxHeights) {
                    int n = maxHeights.size();
                    int[] a = maxHeights.stream().mapToInt(i -> i).toArray();
                    long ans = 0L;
                    for (int num = 0; num < n; num++) {
                        if(num < n - 1 && a[num] < a[num + 1]){
                            continue;
                        }
                        if(num > 0 && a[num] <= a[num - 1]) {
                            continue;
                        }
                        int left = a[num];
                        int right = left;
                        long res = left;
                        for (int i = num - 1; i >= 0; i--) {
                            int temp = a[i];
                            if (temp > left) {
                                res += left;
                            } else {
                                left = temp;
                                res += temp;
                            }
                        }
                        for (int i = num + 1; i < n; i++) {
                            int temp = a[i];
                            if (temp > right) {
                                res += right;
                            } else {
                                res += temp;
                                right = temp;
                            }
                        }
                        ans = Math.max(ans,res);
                    }
                    return ans;
                }
            }

            image.gif


            目录
            相关文章
            |
            1月前
            |
            算法 Java
            LeetCode(一)Java
            LeetCode(一)Java
            |
            3月前
            |
            算法 Java
            LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
            LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
            51 6
            |
            3月前
            |
            存储 算法 Java
            LeetCode经典算法题:打家劫舍java详解
            LeetCode经典算法题:打家劫舍java详解
            70 2
            |
            3月前
            |
            人工智能 算法 Java
            LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
            LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
            50 1
            |
            3月前
            |
            存储 算法 Java
            LeetCode经典算法题:预测赢家+香槟塔java解法
            LeetCode经典算法题:预测赢家+香槟塔java解法
            60 1
            |
            3月前
            |
            存储 算法 Java
            LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
            LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
            79 0
            |
            3月前
            |
            算法 Java
            LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
            LeetCode初级算法题:环形链表+排列硬币+合并两个有序数组java解法
            54 0
            |
            3月前
            |
            存储 算法 Java
            LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
            LeetCode初级算法题:两数之和+斐波拉契数列多种java解法
            39 0
            |
            3月前
            |
            算法 Java 索引
            LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
            LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
            36 0
            |
            3月前
            |
            存储 算法 Java
            LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
            LeetCode初级算法题:反转链表+统计N以内的素数+删除排序数组中的重复项Java详解
            45 0