leetcode1732 莫道水题无意义,心态修炼在其中

🎮莫道水题无意义,心态修炼在其中

清晨的阳光刚透过窗帘缝隙,我正沉浸在"泡面配码,法力无边"的晨间仪式中,窗户再次传来了那熟悉的"砰"的一声闷响。那只掉毛的信鸽又一次精准地砸在了我的键盘旁边——差点把我的 Enter 键给砸飞了。

我熟练地抽出纸条,村长的狂草一如既往地奔放:“小白!今天给你来个休闲养生局!自行车手骑行问题,求最高海拔!简单题,签到题,送分题!别问为什么又是签到,问就是端午节福利大礼包!”

端午节福利?一个虚拟骑行的海拔计算题?我把纸条翻了个面——空白。再翻回来,确实只有这几行字。

靠,这抠门老头,拿一道算法题当端午节福利?别人家的福利是粽子咸鸭蛋,我的福利是数组遍历求前缀和的最大值?要不要再贴个标签——“祝您端午安康,O(n)时间O(1)空间”?村长这是把抠门发挥到了大气层以外!要是让隔壁村的勇者知道,还以为我们村穷到连节日福利都得靠刷题兑换。

窗外的信鸽咕咕叫了两声,眼神里写满了"你自己品"三个大字,然后扑棱着翅膀飞走了。

签到题的自我修养

我把纸条揉成一团,拉过椅子坐下。嘴上嫌弃,身体诚实——来都来了,签到后再嗦面。

“有一个自行车手打算进行一场公路骑行……路线由 n+1 个不同海拔的点组成,从海拔0开始。gain[i]是点i和点i+1的净海拔高度差。返回最高点的海拔。”

再看示例:gain = [-5, 1, 5, 0, -7],海拔序列为 [0, -5, -4, 1, 1, -6],最高是1。

“这哪是骑行啊,“我忍不住吐槽,“这哥们骑的是过山车吧?一会儿上一会儿下,还净海拔高度差,说得这么高大上,不就是 ‘当前位置 += gain[i]’ 吗?”

我挑了挑眉,这题就是求前缀和的最大值:从 0 出发,一路累加 gain[i],沿途顺手记下最大值。

朴实无华的前缀和

思路简单得像新手村教程关卡:一个变量 current 记录当前海拔,每过一个赛段就加上高度差;另一个变量 ans 记录沿途遇到的最高点。一趟遍历,两个变量,O(n)时间,O(1)空间,连数组都不用开。

class Solution:
    def largestAltitude(self, gain: List[int]) -> int:
        ans = tmp = 0
        for val in gain:
            tmp += val      # 累加当前的高度差
            ans = max(ans, tmp)  # 更新最大值
        return ans

点击提交,AC 瞬弹。我盯着那个绿色大勾,总觉得少了点什么。就像全副武装准备打 Boss,结果进门发现是个史莱姆,一刀下去就爆了,连经验值都没给几点。

Pythonic 的优雅一击

就在我准备关题吃面时,脑子里突然蹦出一个念头:“等等,有没有更 Pythonic 的写法?”

一个熟悉的名字——itertools.accumulate——浮现在我的脑袋里,仿佛在大喊“用我用我!”

“accumulate 函数,用于生成累积和。”我回想起文档里的解释,“给它一个可迭代对象,它会返回一个迭代器,依次产生累积的结果。默认是累加,这不正好合适?” 更妙的是,accumulate 还有一个 initial 参数,可以指定初始值。这道题里,自行车手从海拔 0 开始,正好可以用 initial=0 来表示起点。

我兴奋地敲下了新的实现,“Pythonic 一行流!”

from itertools import accumulate

class Solution:
    def largestAltitude(self, gain: List[int]) -> int:
        return max(accumulate(gain, initial=0))

``accumulate(gain, initial=0)依次产出0, gain[0], gain[0]+gain[1], …——完整的海拔序列直接出来了。max` 一把捞出最高点。

再次提交,AC。“这才是 Python 程序员该有的样子嘛!“我得意地笑了笑,“用内置库函数代替手写循环,代码简洁优雅,还能装一波’我很懂 Python’的逼。”

尾声:签到的意义

“所以说,“我一边嗦面一边自言自语,“这道题的意义到底是什么?村长不可能无缘无故给我塞一道’Hello World’级别的签到题吧?”

信鸽不知什么时候又飞回来了,停在窗台上,冲我咕咕叫了两声。我盯着它看了一会儿,“莫非,村长这是在训练我的心态?——遇到难题不要慌,遇到水题不要浪!”

信鸽歪着头看我,眼神里三分认可七分"你戏真多”。我翻开魔法书,在最新一页写下:

海拔爬升前缀和,一行代码定风波。 莫道水题无意义,心态修炼在其中。

写完,我合上魔法书。村长的端午节福利虽然抠门,但至少让我复习了一下 accumulate 的用法。嗯,就当是吃了个代码味的粽子吧。

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。