2865. 美丽塔 I

2024-01-24 16:36
文章标签 美丽 2865

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

说在前面

🎈不知道大家对于算法的学习是一个怎样的心态呢?为了面试还是因为兴趣?不管是出于什么原因,算法学习需要持续保持。

题目描述

给你一个长度为 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] <= 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

解题思路

这题目数据规模比较小,我们可以直接使用前缀和+后缀和来解题。

const arr1 = new Array(maxHeights.length).fill(0);
const len = maxHeights.length;
map[maxHeights[0]] = 1;
for (let i = 1; i < len; i++) {const n = map[maxHeights[i]] || 0;map[maxHeights[i]] = n + 1;let appendNum = 0;if (maxHeights[i] < maxHeights[i - 1]) {appendNum = checkMap(maxHeights[i]);}arr1[i] = arr1[i - 1] + appendNum;
}

从左往右计算最大高度差的部分。首先创建一个长度为 maxHeights 的数组 arr1,用于记录从左边开始的最大高度差。然后使用一个 map 对象记录当前高度出现的次数。接下来遍历给定的高度数组 maxHeights,对于当前高度,如果其比前一个高度要低,则调用 checkMap 函数计算当前位置之前的最大高度差并将结果保存在 appendNum 中。最后将 appendNum 加到 arr1 数组中,更新 arr1 的值。

值得注意的是,由于第一个元素没有前面的元素与其比较,因此在初始化 map 对象时将 maxHeights[0] 的值设为 1 以表示该高度出现了一次。

其中 n 变量表示当前高度在 map 对象中出现的次数。如果 n 不存在,则默认为 0。

const arr2 = new Array(maxHeights.length).fill(0);
const len = maxHeights.length;
map = {};
map[maxHeights[len - 1]] = 1;
let res = arr1[len - 1] + arr2[len - 1];
let sum = maxHeights[len - 1];
for (let i = len - 2; i >= 0; i--) {const n = map[maxHeights[i]] || 0;map[maxHeights[i]] = n + 1;let appendNum = 0;if (maxHeights[i] < maxHeights[i + 1]) {appendNum = checkMap(maxHeights[i]);}arr2[i] = arr2[i + 1] + appendNum;res = Math.min(arr1[i] + arr2[i], res);sum += maxHeights[i];
}

从右往左计算最大高度差的部分。首先创建一个长度为 maxHeights 的数组 arr2,用于记录从右边开始的最大高度差。然后初始化 map 对象,将最后一个元素的值设为 1 表示该高度出现了一次。然后初始化 res 变量为 arr1[len - 1] + arr2[len - 1],表示当前的最小值。

接下来倒序遍历给定的高度数组 maxHeights,对于当前高度,如果其比后一个高度要低,则调用 checkMap 函数计算当前位置之后的最大高度差并将结果保存在 appendNum 中。然后将 appendNum 加到 arr2 数组中,更新 arr2 的值。

同时,在每次遍历时,计算当前位置的最小值并将其与 res 取最小值,并将结果存储在 res 变量中。最后计算所有高度的和并存储在 sum 变量中。

值得注意的是,在处理完最后一个元素后,下一次循环中的 i 值为 len - 2,所以需要在循环中进行一次判断。另外,在初始化 map 对象时需要将之前的对象清空,否则会影响计算结果。

const checkMap = (maxNum) => {let sum = 0;for (let k in map) {if (Number(k) > Number(maxNum)) {sum += (k - maxNum) * map[k];let n = map[maxNum] || 0;map[maxNum] = n + map[k];delete map[k];}}return sum;
};

计算高度差总和。

AC代码

/*** @param {number[]} maxHeights* @return {number}*/
var maximumSumOfHeights = function (maxHeights) {const arr1 = new Array(maxHeights.length).fill(0);const arr2 = new Array(maxHeights.length).fill(0);const len = maxHeights.length;let map = {};const checkMap = (maxNum) => {let sum = 0;for (let k in map) {if (Number(k) > Number(maxNum)) {sum += (k - maxNum) * map[k];let n = map[maxNum] || 0;map[maxNum] = n + map[k];delete map[k];}}return sum;};map[maxHeights[0]] = 1;for (let i = 1; i < len; i++) {const n = map[maxHeights[i]] || 0;map[maxHeights[i]] = n + 1;let appendNum = 0;if (maxHeights[i] < maxHeights[i - 1]) {appendNum = checkMap(maxHeights[i]);}arr1[i] = arr1[i - 1] + appendNum;}map = {};map[maxHeights[len - 1]] = 1;let res = arr1[len - 1] + arr2[len - 1];let sum = maxHeights[len - 1];for (let i = len - 2; i >= 0; i--) {const n = map[maxHeights[i]] || 0;map[maxHeights[i]] = n + 1;let appendNum = 0;if (maxHeights[i] < maxHeights[i + 1]) {appendNum = checkMap(maxHeights[i]);}arr2[i] = arr2[i + 1] + appendNum;res = Math.min(arr1[i] + arr2[i], res);sum += maxHeights[i];}return sum - res;
};

公众号

关注公众号『前端也能这么有趣』,获取更多有趣内容。

说在后面

🎉 这里是 JYeontu,现在是一名前端工程师,有空会刷刷算法题,平时喜欢打羽毛球 🏸 ,平时也喜欢写些东西,既为自己记录 📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解 🙇,写错的地方望指出,定会认真改进 😊,偶尔也会在自己的公众号『前端也能这么有趣』发一些比较有趣的文章,有兴趣的也可以关注下。在此谢谢大家的支持,我们下文再见 🙌。

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



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

相关文章

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

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

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

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

【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 ,

力扣每日一题 美丽下标对的数目 枚举 哈希

Problem: 2748. 美丽下标对的数目 👨‍🏫 参考题解 🍻 暴力法 class Solution {public int countBeautifulPairs(int[] nums) {int res = 0; int n = nums.length;for(int i = 0; i < n; i++){while(nums[i] >= 10){nums[i]

【报告分享】2021小红书美护趋势品牌报告-小红书聚美丽(附下载)

摘要:新锐美护品牌开始为小红书配备独立而完整的电商团队来运营,包括达人种草、博主直播、效果广告投放、品牌旗舰店运营、参与官方活动等, 团队可为单平台的GMV增长负责。曾经,品牌商只能选择在电商平台完成成交,因为要有基础月销数量、客户验证的好评历史数据、以及平台旗舰店的背书等,才能打消用户顾虑并勇敢下单。而现在,“在社交媒体平台的官方旗舰店购买照样是靠谱的”这个消费心智已经健全,社媒平台的交易

LeetCode 每日一题 2748. 美丽下标对的数目

Hey编程小伙伴们👋,今天我要带大家一起解锁力扣上的一道有趣题目—— 美丽下标对的数目 - 力扣 (LeetCode)。这不仅是一次编程挑战,更是一次深入理解欧几里得算法判断互质的绝佳机会!🎉 问题简介 题目要求我们给定一个整数数组 nums,找出所有满足特定条件的下标对。这里的特定条件是:如果 nums[i] 的第一个数字和 nums[j] 的最后一个数字互质,那么我们称这对下标为“美丽

[leetcode] 2269. 找到一个数字的 K 美丽值

一个整数 num 的 k 美丽值定义为 num 中符合以下条件的 子字符串 数目: 子字符串长度为 k 。 子字符串能整除 num 。 给你整数 num 和 k ,请你返回 num 的 k 美丽值。 注意: 允许有 前缀 0 。 0 不能整除任何值。 一个 子字符串 是一个字符串里的连续一段字符序列。 示例 1: 输入:num = 240, k = 2 输出:2 解释:以下是 num 里

2779. 数组的最大美丽值

简单翻译一下题目意思: 对于每个 nums[i] 都可以被替换成 [nums[i]-k, nums[i]+k] 区间中的任何数,区间左右是闭的。在每个数字可以替换的前提下,返回数组中最多的重复数字的数量。 第一想法是用一个哈希表,Key 是可以被替换的数,Value 是这个数出现的次数,那最后遍历这个哈希表,找到 Value 最大的就可以。 class Solution {public in