解題說明
Find the Highest Altitude
題目描述:一個自行車手從海拔 0 出發進行旅程,給定整數陣列 gain,其中 gain[i] 是第 i 段路程的海拔增益(可為負數)。回傳旅程中到達的最高海拔。
解題思路:本質是「前綴和的最大值」問題。從海拔 0 開始,逐步累加 gain 陣列的每個元素,得到各站的海拔高度,記錄過程中的最大值即為答案。只需一次線性掃描,邊累加邊更新最大值,無需額外陣列儲存所有前綴和。
C++ 解法
複雜度分析
時間複雜度:O(n) — 遍歷 gain 陣列一次。
空間複雜度:O(1) — 只使用常數額外空間。
虛擬碼
1. Initialize altitude = 0, ans = 0 // starting point altitude is 0 2. For each gain g in gain[]: a. altitude += g b. ans = max(ans, altitude) 3. Return ans
其他解法
建構前綴和陣列 O(n):先建立長度為 n+1 的前綴和陣列(第 0 項為 0),再對整個陣列取最大值。邏輯等價但佔用 O(n) 額外空間,不如直接邊掃描邊更新最大值。
STL 一行解法:partial_sum 計算所有高度後用 max_element 取最大。可讀性高但同樣需 O(n) 空間。
延伸思考
- 若同時要求回傳最低海拔,程式碼如何修改?
- 若
gain陣列非常大(無法一次載入記憶體),應如何以串流方式求最大海拔? - 此題與「最大子陣列和(Kadane's Algorithm)」有何本質區別?前綴和與子陣列和的最大值分別對應什麼幾何意義?