Leetcode 1732题 - 找到最高海拔

435 阅读2分钟

这是我参与新手入门的第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 。

二、思路分析

首先需要了解题目在表达什么意思,才能很好的解决这个问题。题目中有两个比较重要的信息:

  1. 初始海拔为 0
  2. gain[i] 表示 gain[i]gain[i+1] 的高度差,即当前高度与上一个高度的落差。(题目中说的有点饶了)

题目虽然叫做 找到最高海拔,但是其实理解了题目的意思后,就是通过相邻元素的差值找到元数组中最大的值

例如 示例1gain = [-5,1,5,0,-7] ,他对应的原数组为 [0,-5,-4,1,1,-6],所以原数组中最大值为 1

综上所述,实现方式可以分为一下两种:

  1. 通过差值数组还原原数组,在原数组中找到最大值
  2. 在遍历差值数组时,可得到对应原数组 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;
    }

执行结果如下所示:

image.png

一次遍历(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;
    }

执行结果如下:

image.png

四、总结

理论上讲第二种实现的效率应该会好一点呀,但是实际跑出来确是差不多的 tnt。疑惑?希望有人可以解答一下!