↓快轉到主要內容
  1. LeetCode/

LeetCode 2874: Maximum Value of an Ordered Triplet II

·1 分鐘· ·
LeetCode Medium Prefix-Sum Array
Wei Yi Chung
作者
Wei Yi Chung
Working at the contributing of open source, distributed systems, and data engineering.
目錄

基本資料
#

難易度: medium 第一次嘗試:2025-07-31

  • 提交紀錄:Wrong Answer → Output Limit Exceeded → Accepted

解題思路
#

數字都是正的,所以固定中間的 j 時,nums[i] 要越大越好、nums[k] 也要越大越好(Prefix Sum 模板二):

  • i < j:取 nums[0..j-1] 的最大值。
  • k > j:取 nums[j+1..n-1] 的最大值。

更省空間的寫法是一次掃描:掃到 x 時,把它當成 k,用「目前看過的最大差 nums[i] - nums[j]」乘上它;再把它當成 j 更新最大差;最後當成 i 更新最大值。順序不能反,才能保證 i < j < k。

我的嘗試
#

我用前綴最大和反著建的後綴最大陣列。第一版後綴陣列的位置寫成 n - j - 1,對應到的是 nums[j..] 的最大值,把 j 自己也算進右邊。例如 [6, 2, 1]:唯一的三元組是 (6 - 2) × 1 = 4,這版拿 nums[j] = 2 當 k,回傳 8。改成 n - j - 2 之後,因為留著 debug 的 print 吃了一次 Output Limit Exceeded,拿掉就 AC 了。

正確解法
#

class Solution:
    def maximumTripletValue(self, nums: List[int]) -> int:
        res = max_i = max_diff = 0
        for x in nums:
            res = max(res, max_diff * x)          # x 當 k
            max_diff = max(max_diff, max_i - x)   # x 當 j
            max_i = max(max_i, x)                 # x 當 i
        return res

複雜度
#

時間 O(n),空間 O(1)。

要特別避免的錯誤
#

  • 反著建的後綴陣列,index 要算清楚,不能包含 j 自己。
  • 一次掃描時,先用、再更新,順序是 k、j、i。
  • 送出前拿掉 print。

面試口說整理
#

數字都是正的,固定中間的 j,左邊要最大、右邊也要最大。我一次掃描,維護目前的最大值和目前最大的差 nums[i] - nums[j],每個數先當 k 算答案,再當 j 更新最大差,最後當 i 更新最大值。時間 O(n)、空間 O(1)。

相關文章

LeetCode 1248: Count Number of Nice Subarrays
·2 分鐘
LeetCode Medium Sliding-Window Prefix-Sum Hash-Table Array
LeetCode 1248 解題筆記:「剛好 k 個奇數」不單調,改成「最多 k 個」減「最多 k - 1 個」;或用前綴和 + 雜湊表
LeetCode 3070: Count Submatrices with Top-Left Element and Sum Less Than k
·1 分鐘
LeetCode Medium Array Matrix Prefix-Sum
LeetCode 3070 解題筆記:包含左上角的子矩陣就是二維前綴和 P[i][j],數有幾個 <= k
LeetCode 238: Product of Array Except Self
·1 分鐘
LeetCode Medium Array Prefix-Sum
LeetCode 238 解題筆記:答案是左邊所有數的乘積乘上右邊所有數的乘積,兩次掃描,不用除法
LeetCode 2391: Minimum Amount of Time to Collect Garbage
·1 分鐘
LeetCode Medium Prefix-Sum String Array
LeetCode 2391 解題筆記:撿垃圾時間就是垃圾總數;每台車只要開到自己那種垃圾的最後一間,路程用前綴和
LeetCode 3494: Find the Minimum Amount of Time to Brew Potions
·1 分鐘
LeetCode Medium Simulation Prefix-Sum Array
LeetCode 3494 解題筆記:每瓶藥先往前推出最後一位巫師的完成時間(每個人都要等自己有空),再往回扣出每位巫師的完成時間
LeetCode 3627: Maximum Median Sum of Subsequences of Size 3
·1 分鐘
LeetCode Medium Math Greedy Sorting Game-Theory Array
LeetCode 3627 解題筆記:排序後每次拿最大的兩個和最小的一個,中位數是第二大的;答案是從尾端往前每隔一個取,共 n / 3 個