LeetCode Weekly Contest 374 解題紀錄
那一天,人類終於回想起了,只寫出1題的絕望
Q2 有完全相同的題目,Q3的關鍵在可以固定窗口大小,Q4是反元素的運用,總之還是題目寫的不夠多
All problems solved by python
Q1: 🟢 2951. Find the Peaks 1189
tags: 陣列(Array)
枚舉(Enumeration)
題意
- 給定一個Array ,找出比左右兩側高的數之下標
思路:枚舉
打卡題
1 | class Solution: |
Q2: 🟡 2952. Minimum Number of Coins to be Added 1784
tags: 陣列(Array)
貪心(Greedy)
排序(Sorting)
題意
- 給定一個整數 和 Array ,求使用 構造出 間所有整數,需要在 中添加的元素數量。
思路:歸納法+貪心
- 由小到大構造目標數,令 表示當前可以構造的最大值,則 為下一個要構造的值。
- 當前可以構造的數範圍是 ,在此基礎上若新增一個數 ,則可構造出 。
- 若 ,則兩區間存在重疊,合併後可構造的範圍變成
- 若 ,則兩區間洽連續,也可合併成
- 若 ,則兩區間不連續,無法構造出
- 根據上述討論,先對coins做排序,若 ,則可以構造出 中的所有整數
- 否則代表無法構造出 ,以貪心的方式補充 的硬幣,補充後可以構造出 中的所有整數
- Time Complexity:
類題
- 🟡 1798. Maximum Number of Consecutive Values You Can Make 1931
能夠構造的最大值,else後面改成直接break就可以了 - 🔴 330. Patching Array
一模一樣,改個變數名稱就可以直接AC
1 | class Solution: |
Q3. 🔴 2953. Count Complete Substrings 2449
tags: 分組循環
雜湊表(Hash Table)
字串(String)
滑動窗口(Sliding Window)
題意
給定一個字串 和一個整數 ,若 的子字串 滿足以下兩者條件,則被認為是complete的。
- 中的每個字元恰好出現 次。
- 兩個相鄰字元之間的差異最多為 2。
求 的完整子字串的數量。
思路:分組循環 + 枚舉窗口大小 + 滑動窗口
- 限制2「相鄰字母相差至多為 2」,可以將 分成多個子串 ,每個字串 可以分別處理,且分組後不用關心第二個限制。
- 對於每個子字串 ,枚舉出現的字母數量 ,則根據限制1,窗口大小為 ,此時可以用滑動窗口求出答案。
- 使用長度為26的Array或
Hash Table
紀錄字母的出現次數,更新窗口時檢查是否滿足條件1。- 若逐個字母檢查出現次數,此部分的時間複雜度為
- 若統計出現次數的出現次數,則不用逐個字母檢查,此部分的時間複雜度為
- Time: 或
類題
1 | class Solution: |
Q4. 🔴 2954. Count the Number of Infection Sequences 2645
tags: 陣列(Array)
數學(Math)
組合數學(Combinatorics)
乘法反元素(Inverse Element)
題意
以長度為 的一維Array表示小朋友的感染狀態,下標為 0
到 n-1
,給定 表示感染源的下標。可以感染左右兩側的人,求未被感染的人的感染順序有幾種。
思路:組合數學 + 乘法反元素(逆元)
- 首先,依照感染源將小朋友分成若干段區間,將每段視為同一種顏色,排列方式為 ,其中 , , , … 為各段的長度
- 再來考慮每個區間的感染方式:
- 對於只有一側感染的區間(最左和最右),其感染的方法數只有 種
- 對於兩側都感染的區間,其每次都能感染區間內最左或最右人,但最後一次只剩下一個人,故感染的方法數為 種,其中 為該區間的長度
- 範例:sick = [0, 4, 8, 12], n = 16,
XaaaXbbbXcccXddd
(X表感染)- 非感染區間的長度分別為 0, 3, 3, 3, 3,總長度為 12
- 所求為
- 根據題目限制,區間長度為 ,預先處理 內的所有階層,因為數字可能會很大,所以計算時對 取餘數。
- 對於 m = (a / b) % MOD 的問題,因為除法不能用同餘定理,我們需要將除法轉換成乘法,也就是取 b 在模MOD下的乘法反元素,記做
- (a / b) % MOD = (a * inv(b, MOD)) % MOD = (a % MOD * inv(b, MOD) % MOD) % MOD
- 而 inv(b, MOD) = b ^ (MOD - 2) % MOD,證明如下:
- b * inv(b, MOD) = 1 % MOD
- b * inv(b, MOD) = b ^ (MOD - 1) % MOD (費馬小定理)
- inv(b, MOD) = b ^ (MOD - 2) % MOD ,得證
類題
1 | MAX_N = 10 ** 5 |
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 十六個天亮!
評論
WalineGiscus