这是我参与新手入门的第3篇文章
一、题目描述
力扣第1732题 找到最高海拔 如下所示:
有一个自行车手打算进行一场公路骑行,这条路线总共由 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 。
二、思路分析
首先需要了解题目在表达什么意思,才能很好的解决这个问题。题目中有两个比较重要的信息:
- 初始海拔为
0 gain[i]表示gain[i]和gain[i+1]的高度差,即当前高度与上一个高度的落差。(题目中说的有点饶了)
题目虽然叫做 找到最高海拔,但是其实理解了题目的意思后,就是通过相邻元素的差值找到元数组中最大的值。
例如 示例1 中 gain = [-5,1,5,0,-7] ,他对应的原数组为 [0,-5,-4,1,1,-6],所以原数组中最大值为 1
综上所述,实现方式可以分为一下两种:
- 通过差值数组还原原数组,在原数组中找到最大值
- 在遍历差值数组时,可得到对应原数组
before[i+1]位置的值,又知before[0] = 0。所以可以在遍历差值数组的过程中,找到最大的原数组中的值。
三、AC代码
还原原数组(O(2N))
我们需要一个大小为 i+1 的数组来存储原数组,实现代码如下所示:
public int largestAltitude(int[] gain) {
int[] before = new int[gain.length+1];
// 还原原数组
for (int i=0; i<gain.length; i++) {
before[i+1] = before[i] + gain[i];
}
// 在原数组中找到最大的值
int ret = Integer.MIN_VALUE;
for (int j : before) {
ret = Math.max(ret, j);
}
return ret;
}
执行结果如下所示:
一次遍历(O(N))
在遍历时,直接取 before[i + 1] 和 before[i] 中较大的值(虽然实际没有before数组,但是这样比较容易理解)
public int largestAltitude(int[] gain) {
// 先还原海拔高度
int ret = 0; // 结果集
int currentHeight = 0; // 当前海拔高度
for (int n : gain) {
currentHeight += n;
ret = Math.max(ret, currentHeight);
}
return ret;
}
执行结果如下:
四、总结
理论上讲第二种实现的效率应该会好一点呀,但是实际跑出来确是差不多的 tnt。疑惑?希望有人可以解答一下!