LeetCode Weekly Contest 491 解題紀錄
🟢 3856. Trim Trailing Vowels 1140
tags: 字串(String)
Problem Statement
題目簡述
給定一個由小寫英文字母組成的字串 s,移除其所有尾部母音(a, e, i, o, u)後回傳結果字串。
Constraints
約束條件
s僅由小寫英文字母組成
思路:反向掃描
從字串尾端向前掃描,跳過所有母音字元,找到第一個非母音字元的位置 i,回傳 s[:i+1] 即可。
Python 內建的 str.rstrip() 可以直接移除尾部指定字元集合:s.rstrip("aeiou")。
複雜度分析
- 時間複雜度:
- 空間複雜度:,回傳的新字串
Code
1 | class Solution: |
🟡 3857. Minimum Cost to Split into Ones 1322
tags: 動態規劃(Dynamic Programming), 記憶化搜索(Memoization), 數學(Math), 圖論(Graph Theory), 等價轉化(Equivalence Transformation)
Problem Statement
題目簡述
給定一個整數 。
每次操作可以將一個整數 拆分為兩個正整數 和 (滿足 ),其代價為 。
求將 拆分為 個 的最小總代價。
Constraints
約束條件
思路
這道題從直觀上看,是一個經典的尋找最優解的動態規劃問題。然而,在深入分析後,我們會發現其背後隱藏著一個優美的圖論結論:無論採取何種拆分順序,最終的總代價都是一個固定值。
方法一:記憶化搜索 (Memoization)
首先,從最直覺的角度出發,如果我們要計算拆分 的最小代價,可以嘗試枚舉所有可能的拆分方式。
給定整數 ,我們可以將其拆分為兩個正整數 和 。為了避免重複計算並利用對稱性,可以讓 從 遍歷到 。
每次拆分後,總代價等於「當次拆分的代價 」加上「繼續拆分 的最小代價」與「繼續拆分 的最小代價」。
我們可以利用記憶化搜索(Memoization)來記錄已經計算過的結果,避免重複展開相同的子問題。
狀態轉移方程式如下:
遞迴邊界:當 時,已無法再拆分,代價為 。
複雜度分析
- 時間複雜度:,共 個狀態,每個狀態枚舉約 次。
- 空間複雜度:。
方法二:數學推導(完全圖斷邊模型)
在補題才發現,本題除了動態規劃之外,還可以使用數學推導的方法來做到 的時間複雜度。
如果我們仔細觀察題意中的代價計算方式 ,可以將其巧妙地對映到圖論中的「完全圖(Complete Graph)」模型。
我們可以將拆分問題轉換為以下過程:
- 初始狀態:想像有一個包含 個節點的完全圖,任意兩個節點之間皆有一條無向邊。總邊數為 條。
- 拆分操作的對映:將大小為 的集合拆分為大小為 和 的兩個子集,這相當於將這 個節點劃分成 和 兩組。
- 操作代價的本質:劃分後,組 到組 之間所有的連邊都被切斷了。因為 有 個節點、 有 個節點,被斷開的邊數剛好是 條!也就是說,題目的拆分代價,等價於被斷開的邊數。
- 遞迴與終止:對已經分開的各組繼續遞迴拆分,直到所有組別的大小都變為 (即圖中只剩下孤立的節點,無法再切斷任何邊為止)。
當所有節點最終全都被拆成單獨的 時,代表初始狀態下這張完全圖中的所有邊都已經被徹底斷開。
既然無論採取什麼順序去拆分,最終得到的都是 個孤立的點,那麼總共被斷開的邊數必定等於初始的總邊數 。
這意味著,無論如何去拆分,總結算代價必定是一個常數:。
複雜度分析
- 時間複雜度:。
- 空間複雜度:。
參考資料
Code
方法一:記憶化搜索 (Memoization)
1 |
|
方法二:數學推導(完全圖斷邊模型)
1 | class Solution: |
🟡 3858. Minimum Bitwise OR From Grid 1947
tags: 貪心(Greedy), 位運算(Bit Manipulation), 試填法
Problem Statement
題目簡述
給定一個大小為 的整數矩陣 grid。
你必須從每一橫列(row)中恰好選擇一個整數,求出所有選定整數的最小可能位元或(Bitwise OR)。
Constraints
約束條件
思路:試填法(從高位貪心)
第 b 位是指二進位底數從 開始計算的位元位置(即代表數值 的位置)。例如最低位為第 位、次低位為第 位。
位元或的性質是「只增不減」——一旦某個位元被設為 1,就無法消去。因此高位的 1 對結果的影響遠大於所有低位的總和,我們應盡力讓高位為 0。
貪心策略
從最高位到最低位,逐位判斷答案 ans 的第 b 位能否為 0:
- 能為
0:每一橫列(row)都存在至少一個數字x,使得選它不會在第b位及更高位引入多餘的1。此時保持第b位為0,繼續處理下一位。 - 必須為
1:某一橫列(row)的所有數字都無法滿足上述條件,說明該列無論怎麼選都會發生衝突(迫使第b位或更高位出現不該有的1)。因為更高位在先前的步驟中已經驗證並固定,只需令當前的第b位為1(即ans |= (1 << b))即可,然後處理下一位。
判定條件
對於候選數字 x,我們可以用以下條件驗證「假設第 b 位為 0,選 x 是否相容」:
>> b << b 的作用是清除低於第 b 位()的所有位元。由於我們從高到低填入,ans 在 的位元此刻一定全為 0,而第 b 位我們正好需要假設為 0。
因此等式成立代表:x | ans 在 的位元與 ans 完全一致——x 既沒有在已確定為 0 的高位引入 1,也沒有在第 b 位產生 1。
複雜度分析
- 時間複雜度:,其中 ,。
- 空間複雜度:。
Code
1 | class Solution: |
🔴 3859. Count Subarrays With K Distinct Integers 2302
tags: 雙指標(Two Pointers), 滑動窗口(Sliding Window), 雜湊表(Hash Table)
Problem Statement
題目簡述
給定一個整數陣列 nums 和兩個整數 k 與 m。
求出滿足以下兩個條件的子陣列數量:
- 子陣列中恰好包含
k個不同的數字。 - 子陣列中的每個不同數字,都出現至少
m次。
Constraints
約束條件
思路:恰好型滑動窗口
隨著窗口的範圍變大,窗口內不同整數的數量與每個整數出現的頻率都是單調遞增的,因此可以用滑動窗口解題。
本題的難點在於「恰好包含 個不同整數」。但所有「恰好 個」的計數問題,都可以透過差分轉化為:「至少 個」減去「至少 個」,或是「至多 個」減去「至多 個」。
恰好 個 (至少 個) (至少 個)
恰好 個 (至多 個) (至多 個)
這是處理「恰好型滑動窗口」的經典手法。
以本題為例,因為恰好只有 個不同數字,所以條件可轉化為:
- 「子陣列至少包含 個不同整數,且至少 個整數出現次數 」
- 減去「子陣列至少包含 個不同整數,且至少 個整數出現次數 」
因為我們在這裡的容斥目標只是為了精確定位「恰好 個不同整數」,而把「有 個整數頻率達標」當作一個固定的門檻。
如果在減去大範圍時,將條件改成「至少 個達標」,就會漏扣掉「有 種數字,但只有 種數字達標」的不合法子陣列!
定義 calc(lim) 計算「至少 lim 種不同數字、且至少 k 種數字出現 次」的子陣列數,則:
calc(lim) 用標準滑動窗口實作:右端 right 每次右移一格,將 nums[right] 加入哈希表 cnt,並用 good 記錄出現次數 的種類數。當條件滿足時,不斷右移 left 直到條件被破壞,此時以 right 為結尾的有效子陣列數量恰為 left。
複雜度分析
- 時間複雜度:,因為
calc函數中left和right指針都只會不斷向右移動,最多遍歷陣列一次,哈希表操作時間為 。呼叫兩次函數總時間仍為 。 - 空間複雜度:,最糟情況下哈希表需儲存 個不同的數字。
類題
- 🟡 2962. Count Subarrays Where Max Element Appears at Least K Times 1701
- 🔴 992. Subarrays with K Different Integers 2210
Code
1 | class Solution: |
寫在最後
PROMPT
masterpiece, best quality, high quality, good quality, 32K UHD, colorful, official art, illustration, in the style of fashion photography, dynamic, dynamic force picture, (Visual impact:1.2), impactful picture, extreme aesthetic, A shot with tension, sharp focus, The Ninth Art, depth of field, cinematic lighting, light particles, lens flare, movie perspective, (Tyndall Effect:1.4), light particles, light, shadow, scenery, temperate atmosphere, (artist:pigeon666:0.83), (Yomu:0.4), (remsrar:0.45), (quasarcake:0.3),
1girl, solo, tachibana sherry, yellow eyes, blue hair, short hair, hair ornament, braid, hair rings, braided hair rings, hat, black headwear, blue necktie, necktie, black necktie bow, black capelet, grey vest, collared shirt, long sleeves, blue skirt, pleated skirt, plaid skirt, frilled skirt, single thighhigh, footwear bow, frilled socks, asymmetrical legwear, single leg pantyhose, black pantyhose, playful pose, hands near head, cat pose, smiling, open mouth, looking at viewer, bust shot, close-up, blue sky background, cloudless sky, white bird, mascot, floating bird, sparkles, shining, star (symbol), bright lighting, vibrant colors, high-key lighting,
The character is captured in a vibrant close-up bust shot, posing playfully with her hands raised near her head in a charming, cat-like gesture. She gazes directly at the viewer with shimmering yellow eyes and a beaming, joyful smile that radiates energy. The background is a crisp, brilliant blue sky adorned with floating white stars and a small, round white bird mascot hovering nearby. Sunlight drenches the scene, creating high-contrast shadows and a brilliant glow that emphasizes the vivid blue of her hair and the clean aesthetic of her silhouette, resulting in a lively and heart-warming atmosphere.
本場 VP,以下銳評:
- Q2: 很有趣的題目,等價轉化的思路太妙了!
- Q3: 感覺已經變成套路了
- Q4: 因為之前不小心瞄到了影片標題,所以一下就出來了,賽時應該不可能這麼順利









