这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情
问题描述
有一个自行车手打算进行一场公路骑行,这条路线总共由 n + 1 个不同海拔的点组成。自行车手从海拔为 0 的点 0 开始骑行。
给你一个长度为 n 的整数数组 gain ,其中 gain[i] 是点 i 和点 i + 1 的 净海拔高度差(0 <= i < n)。请你返回 最高点的海拔 。
示例 1:
输入:gain = [-5,1,5,0,-7]
输出:1
解释:海拔高度依次为 [0,-5,-4,1,1,-6] 。最高海拔为 1 。
示例 2:
输入:gain = [-4,-3,-2,-1,4,3,2]
输出:0
解释:海拔高度依次为 [0,-4,-7,-9,-10,-6,-3,-1] 。最高海拔为 0 。
提示:
- n == gain.length
- 1 <= n <= 100
- -100 <= gain[i] <= 100
思路分析
首先我们先要理解一下题目意思,题目会给我们一个数组,数组中存放着n个整数,每个整数代表其与上一个点的净海拔高度差,我们需要通过这些高度差找到其经过的最高海拔高度。题目中说到自行车手是从海拔为 0 的点 0 开始骑行,也就是说第一个点的相对海拔高度就是其数组的值,所以我们可以直接遍历这个数组,从第一位开始向后遍历求出整个数组的前缀和,其前缀和数组表示的即是每个点的相对海拔高度。
前缀和:前缀和可以简单理解为「数列的前 n 项的和」,是一种重要的预处理方式,能大大降低查询的时间复杂度。
for (let i = 1; i < gain.length; i++) {
gain[i] += gain[i - 1];
}
因为是从海拔为 0 的点 0 开始骑行,所以 0 也是其经过的一个海拔高度点,我们需要将海拔为 0 的点也放入数组中去。
gain.push(0);
我们可以再遍历的时候使用一个遍历保存其遍历过程中遇到的最大值,当然也可以在最后直接找出数组中的最大值即可,这里我直接使用Math.max函数来简单求得gain数组中的最大值。
return Math.max(...gain);
完整 AC 代码如下:
AC 代码
/**
* @param {number[]} gain
* @return {number}
*/
var largestAltitude = function (gain) {
for (let i = 1; i < gain.length; i++) {
gain[i] += gain[i - 1];
}
gain.push(0);
return Math.max(...gain);
};
说在后面
本人为算法业余爱好者,平时只是随着兴趣偶尔刷刷题,如果上面分享有错误的地方,欢迎指出,感激不尽。