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

LeetCode 334: Increasing Triplet Subsequence

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

基本資料
#

難易度: medium 第一次嘗試:2022-11-17

  • 提交紀錄:Time Limit Exceeded → Runtime Error → Accepted → Wrong Answer

解題思路
#

貪心(Greedy):first 是目前看過最小的數,second 是「前面有某個更小的數」的數裡最小的。新的數 x:x <= first 就更新 first;否則 x <= second 就更新 second;否則 x > second,找到三元組。更新 first 之後 second 不用動:它前面原本就有一個更小的數,三元組仍然成立。比較要用 <=,相等的數不能當成遞增。

我的嘗試
#

  • 2022 年第一版用遞迴枚舉三個 index,指數級 TLE。之後改成上面的 first、second 貪心就 AC 了。
  • 2025 年重寫時寫成 if first > num: first, second = num, first、elif second > num:
    • 用了嚴格的 >,等於 first 的數掉到下一個分支被當成 second:[0, 0, 1] 回傳 True,答案 False。
    • 更新 first 時把舊的 first 移給 second,這個想法本身也不對:舊的 first 前面不一定有比它小的數。

正確解法
#

class Solution:
    def increasingTriplet(self, nums: List[int]) -> bool:
        first = second = float("inf")
        for x in nums:
            if x <= first:
                first = x
            elif x <= second:
                second = x
            else:
                return True
        return False

複雜度
#

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

要特別避免的錯誤
#

  • 用 <=:等於 first 的數不能拿來當 second。
  • 更新 first 時不要把舊的 first 移到 second。
  • 枚舉三個 index 是 O(n³)。

面試口說整理
#

我維護兩個值:目前最小的 first,和前面有比它小的數之中最小的 second。新的數不大於 first 就更新 first,不大於 second 就更新 second,比 second 大就找到了。時間 O(n)、空間 O(1)。

相關文章

LeetCode 324: Wiggle Sort II
·1 分鐘
LeetCode Medium Array Divide-and-Conquer Greedy Sorting
LeetCode 324 解題筆記:排序後分成小的一半和大的一半,各自反轉後交錯放:小的放偶數位置、大的放奇數位置
LeetCode 435: Non-overlapping Intervals
·1 分鐘
LeetCode Medium Array Dynamic-Programming Greedy Sorting
LeetCode 435 解題筆記:最少刪幾個 = 總數減掉最多能保留幾個;按右端點排序,貪心保留結束最早的
LeetCode 134: Gas Station
·1 分鐘
LeetCode Medium Array Greedy
LeetCode 134 解題筆記:總油量不夠就不可能;否則從左掃,油箱變負就把起點移到下一站
LeetCode 11: Container With Most Water
·1 分鐘
LeetCode Medium Array Two-Pointers Greedy
LeetCode 11 解題筆記:左右指針從兩端開始,每次移動比較矮的那一邊;移動高的那邊只會讓寬度變小、高度不會變高
LeetCode 402: Remove K Digits
·1 分鐘
LeetCode Medium String Stack Greedy Monotonic-Stack
LeetCode 402 解題筆記:單調遞增 stack,遇到比頂端小的數字就把頂端刪掉(還有 k 次可刪時),最後去掉前導零
LeetCode 313: Super Ugly Number
·1 分鐘
LeetCode Medium Array Math Dynamic-Programming
LeetCode 313 解題筆記:LC 264 的推廣,每個質數一個指針;用 heap 的話要避免同一個數被推進去很多次