2024年4月刷題記錄

jiamian22發表於2024-08-01

2024年4月1日

【leetcode】2810. 故障鍵盤

題意:

你的筆記本鍵盤存在故障,每當你在上面輸入字元 'i' 時,它會反轉你所寫的字串。而輸入其他字元則可以正常工作。

給你一個下標從 0 開始的字串 s ,請你用故障鍵盤依次輸入每個字元。

返回最終筆記本螢幕上輸出的字串。




2024年4月2日

【leetcode】894. 所有可能的真二叉樹

題意:

給你一個整數 n ,請你找出所有可能含 n 個節點的 真二叉樹 ,並以列表形式返回。答案中每棵樹的每個節點都必須符合 Node.val == 0

答案的每個元素都是一棵真二叉樹的根節點。你可以按 任意順序 返回最終的真二叉樹列表

真二叉樹 是一類二叉樹,樹中每個節點恰好有 02 個子節點。




2024年4月3日

【leetcode】1379. 找出克隆二叉樹中的相同節點

題意:

給你兩棵二叉樹,原始樹 original 和克隆樹 cloned,以及一個位於原始樹 original 中的目標節點 target

其中,克隆樹 cloned 是原始樹 original 的一個 副本

請找出在樹 cloned 中,與 target 相同 的節點,並返回對該節點的引用(在 C/C++ 等有指標的語言中返回 節點指標,其他語言返回節點本身)。

注意:不能 對兩棵二叉樹,以及 target 節點進行更改。只能 返回對克隆樹 cloned 中已有的節點的引用。




2024年4月4日

【leetcode】2192. 有向無環圖中一個節點的所有祖先

題意:

給你一個正整數 n ,它表示一個 有向無環圖 中節點的數目,節點編號為 0n - 1 (包括兩者)。

給你一個二維整數陣列 edges ,其中 edges[i] = [from_i, to_i] 表示圖中一條從 from_ito_i 的單向邊。

請你返回一個陣列 answer,其中 answer[i]是第 i 個節點的所有 祖先 ,這些祖先節點 升序 排序。

如果 u 透過一系列邊,能夠到達 v ,那麼我們稱節點 u 是節點 v祖先 節點。




2024年4月5日

【leetcode】1026. 節點與其祖先之間的最大差值

題意:

給定二叉樹的根節點 root,找出存在於 不同 節點 AB 之間的最大值 V,其中 V = |A.val - B.val|,且 AB 的祖先。

(如果 A 的任何子節點之一為 B,或者 A 的任何子節點是 B 的祖先,那麼我們認為 A 是 B 的祖先)




2024年4月6日

【leetcode】1483. 樹節點的第 K 個祖先

題意:

給你一棵樹,樹上有 n 個節點,按從 0n-1 編號。樹以父節點陣列的形式給出,其中 parent[i] 是節點 i 的父節點。樹的根節點是編號為 0 的節點。

樹節點的第 k 個祖先節點是從該節點到根節點路徑上的第 k 個節點。

實現 TreeAncestor 類:

  • TreeAncestor(int n, int[] parent) 對樹和父陣列中的節點數初始化物件。
  • getKthAncestor(int node, int k) 返回節點 node 的第 k 個祖先節點。如果不存在這樣的祖先節點,返回 -1



2024年4月7日

【leetcode】1600. 王位繼承順序

題意:

一個王國裡住著國王、他的孩子們、他的孫子們等等。每一個時間點,這個家庭裡有人出生也有人死亡。

這個王國有一個明確規定的王位繼承順序,第一繼承人總是國王自己。我們定義遞迴函式 Successor(x, curOrder) ,給定一個人 x 和當前的繼承順序,該函式返回 x 的下一繼承人。

Successor(x, curOrder):
    如果 x 沒有孩子或者所有 x 的孩子都在 curOrder 中:
        如果 x 是國王,那麼返回 null
        否則,返回 Successor(x 的父親, curOrder)
    否則,返回 x 不在 curOrder 中最年長的孩子

比方說,假設王國由國王,他的孩子 Alice 和 Bob (Alice 比 Bob 年長)和 Alice 的孩子 Jack 組成。

  1. 一開始, curOrder["king"].
  2. 呼叫 Successor(king, curOrder) ,返回 Alice ,所以我們將 Alice 放入 curOrder 中,得到 ["king", "Alice"]
  3. 呼叫 Successor(Alice, curOrder) ,返回 Jack ,所以我們將 Jack 放入 curOrder 中,得到 ["king", "Alice", "Jack"]
  4. 呼叫 Successor(Jack, curOrder) ,返回 Bob ,所以我們將 Bob 放入 curOrder 中,得到 ["king", "Alice", "Jack", "Bob"]
  5. 呼叫 Successor(Bob, curOrder) ,返回 null 。最終得到繼承順序為 ["king", "Alice", "Jack", "Bob"]

透過以上的函式,我們總是能得到一個唯一的繼承順序。

請你實現 ThroneInheritance 類:

  • ThroneInheritance(string kingName) 初始化一個 ThroneInheritance 類的物件。國王的名字作為建構函式的引數傳入。
  • void birth(string parentName, string childName) 表示 parentName 新擁有了一個名為 childName 的孩子。
  • void death(string name) 表示名為 name 的人死亡。一個人的死亡不會影響 Successor 函式,也不會影響當前的繼承順序。你可以只將這個人標記為死亡狀態。
  • string[] getInheritanceOrder() 返回 除去 死亡人員的當前繼承順序列表。



2024年4月9日

【leetcode】2529. 正整數和負整數的最大計數

題意:

給你一個按 非遞減順序 排列的陣列 nums ,返回正整數數目和負整數數目中的最大值。

  • 換句話講,如果 nums 中正整數的數目是 pos ,而負整數的數目是 neg ,返回 posneg二者中的最大值。

注意:0 既不是正整數也不是負整數。




2024年4月10日

【leetcode】1702. 修改後的最大二進位制字串

題意:

給你一個二進位制字串 binary ,它僅有 0 或者 1 組成。你可以使用下面的操作任意次對它進行修改:

  • 操作 1 :如果二進位制串包含子字串 "00" ,你可以用 "10" 將其替換。
    • 比方說, "**00**010" -> "**10**010"
  • 操作 2 :如果二進位制串包含子字串 "10" ,你可以用 "01" 將其替換。
    • 比方說, "000**10**" -> "000**01**"

請你返回執行上述操作任意次以後能得到的 最大二進位制字串 。如果二進位制字串 x 對應的十進位制數字大於二進位制字串 y 對應的十進位制數字,那麼我們稱二進位制字串 x 大於二進位制字串 y




2024年4月11日

【leetcode】1766. 互質樹

題意:

給你一個 n 個節點的樹(也就是一個無環連通無向圖),節點編號從 0n - 1 ,且恰好有 n - 1 條邊,每個節點有一個值。樹的 根節點 為 0 號點。

給你一個整數陣列 nums 和一個二維陣列 edges 來表示這棵樹。nums[i] 表示第 i 個點的值,edges[j] = [uj, vj] 表示節點 uj 和節點 vj 在樹中有一條邊。

gcd(x, y) == 1 ,我們稱兩個數 xy互質的 ,其中 gcd(x, y)xy最大公約數

從節點 i 最短路徑上的點都是節點 i 的祖先節點。一個節點 不是 它自己的祖先節點。

請你返回一個大小為 n 的陣列 ans ,其中 ans[i]是離節點 i 最近的祖先節點且滿足 nums[i]nums[ans[i]]互質的 ,如果不存在這樣的祖先節點,ans[i]-1




2024年4月12日

【leetcode】2923. 找到冠軍 I

題意:

一場比賽中共有 n 支隊伍,按從 0n - 1 編號。

給你一個下標從 0 開始、大小為 n * n 的二維布林矩陣 grid 。對於滿足 0 <= i, j <= n - 1i != j 的所有 i, j :如果 grid[i][j] == 1,那麼 i 隊比 j ;否則,j 隊比 i

在這場比賽中,如果不存在某支強於 a 隊的隊伍,則認為 a 隊將會是 冠軍

返回這場比賽中將會成為冠軍的隊伍。




2024年4月13日

【leetcode】2924. 找到冠軍 II

題意:

一場比賽中共有 n 支隊伍,按從 0n - 1 編號。每支隊伍也是 有向無環圖(DAG) 上的一個節點。

給你一個整數 n 和一個下標從 0 開始、長度為 m 的二維整數陣列 edges 表示這個有向無環圖,其中 edges[i] = [u_i, v_i] 表示圖中存在一條從 u_i 隊到 v_i 隊的有向邊。

a 隊到 b 隊的有向邊意味著 a 隊比 b ,也就是 b 隊比 a

在這場比賽中,如果不存在某支強於 a 隊的隊伍,則認為 a 隊將會是 冠軍

如果這場比賽存在 唯一 一個冠軍,則返回將會成為冠軍的隊伍。否則,返回 -1




2024年4月14日

【leetcode】705. 設計雜湊集合

題意:

不使用任何內建的雜湊表庫設計一個雜湊集合(HashSet)。

實現 MyHashSet 類:

  • void add(key) 向雜湊集合中插入值 key
  • bool contains(key) 返回雜湊集合中是否存在這個值 key
  • void remove(key) 將給定值 key 從雜湊集合中刪除。如果雜湊集合中沒有這個值,什麼也不做。



2024年4月15日

【leetcode】147. 對連結串列進行插入排序

題意:

給定單個連結串列的頭 head ,使用 插入排序 對連結串列進行排序,並返回 排序後連結串列的頭




【leetcode】148. 排序連結串列

題意:

給你連結串列的頭結點 head ,請將其按 升序 排列並返回 排序後的連結串列

連結串列中節點的數目在範圍 [0, 5*10^4] 內,且 -10^5 <= Node.val <= 10^5 。要求在 O(nlog n) 時間複雜度和常數級空間複雜度下,對連結串列進行排序。




【leetcode】706. 設計雜湊對映

題意:

不使用任何內建的雜湊表庫設計一個雜湊對映(HashMap)。

實現 MyHashMap 類:

  • MyHashMap() 用空對映初始化物件
  • void put(int key, int value) 向 HashMap 插入一個鍵值對 (key, value) 。如果 key 已經存在於對映中,則更新其對應的值 value
  • int get(int key) 返回特定的 key 所對映的 value ;如果對映中不包含 key 的對映,返回 -1
  • void remove(key) 如果對映中存在 key 的對映,則移除 key 和它所對應的 value



2024年4月16日

【leetcode】924. 儘量減少惡意軟體的傳播

題意:

給出了一個由 n 個節點組成的網路,用 n × n 個鄰接矩陣圖 graph 表示。在節點網路中,當 graph[i][j] = 1 時,表示節點 i 能夠直接連線到另一個節點 j

一些節點 initial 最初被惡意軟體感染。只要兩個節點直接連線,且其中至少一個節點受到惡意軟體的感染,那麼兩個節點都將被惡意軟體感染。這種惡意軟體的傳播將繼續,直到沒有更多的節點可以被這種方式感染。

假設 M(initial) 是在惡意軟體停止傳播之後,整個網路中感染惡意軟體的最終節點數。

如果從 initial移除某一節點能夠最小化 M(initial), 返回該節點。如果有多個節點滿足條件,就返回索引最小的節點。

請注意,如果某個節點已從受感染節點的列表 initial 中刪除,它以後仍有可能因惡意軟體傳播而受到感染。




2024年4月17日

【leetcode】928. 儘量減少惡意軟體的傳播 II

題意:

給定一個由 n 個節點組成的網路,用 n x n 個鄰接矩陣 graph 表示。在節點網路中,只有當 graph[i][j] = 1 時,節點 i 能夠直接連線到另一個節點 j

一些節點 initial 最初被惡意軟體感染。只要兩個節點直接連線,且其中至少一個節點受到惡意軟體的感染,那麼兩個節點都將被惡意軟體感染。這種惡意軟體的傳播將繼續,直到沒有更多的節點可以被這種方式感染。

假設 M(initial) 是在惡意軟體停止傳播之後,整個網路中感染惡意軟體的最終節點數。

我們可以從 initial刪除一個節點並完全移除該節點以及從該節點到任何其他節點的任何連線。

請返回移除後能夠使 M(initial) 最小化的節點。如果有多個節點滿足條件,返回索引 最小的節點




2024年4月18日

【leetcode】2007. 從雙倍陣列中還原原陣列

題意:

一個整數陣列 original 可以轉變成一個 雙倍 陣列 changed ,轉變方式為將 original 中每個元素 值乘以 2 加入陣列中,然後將所有元素 隨機打亂

給你一個陣列 changed ,如果 change雙倍 陣列,那麼請你返回 original陣列,否則請返回空陣列。original 的元素可以以 任意 順序返回。




2024年4月19日

【leetcode】128. 最長連續序列

題意:

給定一個未排序的整數陣列 nums ,找出數字連續的最長序列(不要求序列元素在原陣列中連續)的長度。

請你設計並實現時間複雜度為 O(n) 的演算法解決此問題。




2024年4月20日

【leetcode】678. 有效的括號字串

題意:

給你一個只包含三種字元的字串,支援的字元型別分別是 '('')''*'。請你檢驗這個字串是否為有效字串,如果是有效字串返回 true

有效字串符合如下規則:

  • 任何左括號 '(' 必須有相應的右括號 ')'
  • 任何右括號 ')' 必須有相應的左括號 '('
  • 左括號 '(' 必須在對應的右括號之前 ')'
  • '*' 可以被視為單個右括號 ')' ,或單個左括號 '(' ,或一個空字串。
  • 一個空字串也被視為有效字串。



【leetcode】39. 組合總和

題意:

給你一個 無重複元素 的整數陣列 candidates 和一個目標整數 target ,找出 candidates 中可以使數字和為目標數 target 的 所有 不同組合 ,並以列表形式返回。你可以按 任意順序 返回這些組合。

candidates 中的 同一個 數字可以 無限制重複被選取 。如果至少一個數字的被選數量不同,則兩種組合是不同的。

對於給定的輸入,保證和為 target 的不同組合數少於 150 個。




2024年4月21日

【leetcode】216. 組合總和 III

題意:

找出所有相加之和為 nk 個數的組合,且滿足下列條件:

  • 只使用數字1到9
  • 每個數字 最多使用一次

返回 所有可能的有效組合的列表 。該列表不能包含相同的組合兩次,組合可以以任何順序返回。




2024年4月22日

【leetcode】560. 和為 K 的子陣列

題意:

給你一個整數陣列 nums 和一個整數 k ,請你統計並返回 該陣列中和為 k 的子陣列的個數

子陣列是陣列中元素的連續非空序列。

提示:

  • 1 <= nums.length <= 2 * 10^4
  • -1000 <= nums[i] <= 1000
  • -10^7 <= k <= 10^7



【leetcode】230. 二叉搜尋樹中第K小的元素

題意:

給定一個二叉搜尋樹的根節點 root ,和一個整數 k ,請你設計一個演算法查詢其中第 k 個最小元素(從 1 開始計數)。

進階:如果二叉搜尋樹經常被修改(插入/刪除操作)並且你需要頻繁地查詢第 k 小的值,你將如何最佳化演算法?




【leetcode】77. 組合

題意:

給定兩個整數 nk,返回範圍 [1, n] 中所有可能的 k 個數的組合。

你可以按 任何順序 返回答案。




【leetcode】40. 組合總和 II

題意:

給定一個候選人編號的集合 candidates 和一個目標數 target ,找出 candidates 中所有可以使數字和為 target 的組合。

candidates 中的每個數字在每個組合中只能使用 一次

注意:解集不能包含重複的組合。




【leetcode】377. 組合總和 Ⅳ

題意:

給你一個由 不同 整陣列成的陣列 nums ,和一個目標整數 target 。請你從 nums 中找出並返回總和為 target 的元素組合的個數。

題目資料保證答案符合 32 位整數範圍。




2024年4月23日

【leetcode】1052. 愛生氣的書店老闆

題意:

有一個書店老闆,他的書店開了 n 分鐘。每分鐘都有一些顧客進入這家商店。給定一個長度為 n 的整數陣列 customers ,其中 customers[i] 是在第 i 分鐘開始時進入商店的顧客數量,所有這些顧客在第 i 分鐘結束後離開。

在某些時候,書店老闆會生氣。 如果書店老闆在第 i 分鐘生氣,那麼 grumpy[i] = 1,否則 grumpy[i] = 0

當書店老闆生氣時,那一分鐘的顧客就會不滿意,若老闆不生氣則顧客是滿意的。

書店老闆知道一個秘密技巧,能抑制自己的情緒,可以讓自己連續 minutes 分鐘不生氣,但卻只能使用一次。

請你返回 這一天營業下來,最多有多少客戶能夠感到滿意




【leetcode】1456. 定長子串中母音的最大數目

題意:

給你字串 s 和整數 k

請返回字串 s 中長度為 k 的單個子字串中可能包含的最大母音字母數。

英文中的 母音字母 為(a, e, i, o, u)。




2024年4月24日

【leetcode】2385. 感染二叉樹需要的總時間

題意:

給你一棵二叉樹的根節點 root ,二叉樹中節點的值 互不相同 。另給你一個整數 start 。在第 0 分鐘,感染 將會從值為 start 的節點開始爆發。

每分鐘,如果節點滿足以下全部條件,就會被感染:

  • 節點此前還沒有感染。
  • 節點與一個已感染節點相鄰。

返回感染整棵樹需要的分鐘數




2024年4月25日

【leetcode】2739. 總行駛距離

題意:

卡車有兩個油箱。給你兩個整數,mainTank 表示主油箱中的燃料(以升為單位),additionalTank 表示副油箱中的燃料(以升為單位)。

該卡車每耗費 1 升燃料都可以行駛 10 km。每當主油箱使用了 5 升燃料時,如果副油箱至少有 1 升燃料,則會將 1 升燃料從副油箱轉移到主油箱。

返回卡車可以行駛的最大距離。

注意:從副油箱向主油箱注入燃料不是連續行為。這一事件會在每消耗 5 升燃料時突然且立即發生。




2024年4月26日

【leetcode】1146. 快照陣列

題意:

實現支援下列介面的「快照陣列」- SnapshotArray:

  • SnapshotArray(int length) - 初始化一個與指定長度相等的 類陣列 的資料結構。初始時,每個元素都等於 0
  • void set(index, val) - 會將指定索引 index 處的元素設定為 val
  • int snap() - 獲取該陣列的快照,並返回快照的編號 snap_id(快照號是呼叫 snap() 的總次數減去 1)。
  • int get(index, snap_id) - 根據指定的 snap_id 選擇快照,並返回該快照指定索引 index 的值。



2024年4月27日

【leetcode】2639. 查詢網格圖中每一列的寬度

題意:

給你一個下標從 0 開始的 m x n 整數矩陣 grid 。矩陣中某一列的寬度是這一列數字的最大 字串長度

  • 比方說,如果 grid = [[-10], [3], [12]] ,那麼唯一一列的寬度是 3 ,因為 -10 的字串長度為 3

請你返回一個大小為 n 的整數陣列 ans ,其中 ans[i] 是第 i 列的寬度。

一個有 len 個數位的整數 x ,如果是非負數,那麼 字串長度len ,否則為 len + 1




2024年4月28日

【leetcode】2639. 查詢網格圖中每一列的寬度

題意:

給你一個整數 n ,以二進位制字串的形式返回該整數的 負二進位制(base -2表示。

注意,除非字串就是 "0",否則返回的字串中不能含有前導零。




2024年4月29日

【leetcode】1329. 將矩陣按對角線排序

題意:

矩陣對角線 是一條從矩陣最上面行或者最左側列中的某個元素開始的對角線,沿右下方向一直到矩陣末尾的元素。例如,矩陣 mat63 列,從 mat[2][0] 開始的 矩陣對角線 將會經過 mat[2][0]mat[3][1]mat[4][2]

給你一個 m * n 的整數矩陣 mat ,請你將同一條 矩陣對角線 上的元素按升序排序後,返回排好序的矩陣。




2024年4月30日

【leetcode】2798. 滿足目標工作時長的員工數目

題意:

公司裡共有 n 名員工,按從 0n - 1 編號。每個員工 i 已經在公司工作了 hours[i] 小時。

公司要求每位員工工作 至少 target 小時。

給你一個下標從 0 開始、長度為 n 的非負整數陣列 hours 和一個非負整數 target

請你用整數表示並返回工作至少 target 小時的員工數。