2024年3月刷題記錄

jiamian22發表於2024-08-01

2024年3月1日

【leetcode】2369. 檢查陣列是否存在有效劃分

題意:

給你一個下標從 0 開始的整數陣列 nums ,你必須將陣列劃分為一個或多個 連續 子陣列。

如果獲得的這些子陣列中每個都能滿足下述條件 之一 ,則可以稱其為陣列的一種 有效 劃分:

  1. 子陣列 2 個相等元素組成,例如,子陣列 [2,2]
  2. 子陣列 3 個相等元素組成,例如,子陣列 [4,4,4]
  3. 子陣列 3 個連續遞增元素組成,並且相鄰元素之間的差值為 1 。例如,子陣列 [3,4,5] ,但是子陣列 [1,3,5] 不符合要求。

如果陣列 至少 存在一種有效劃分,返回 true ,否則,返回 false




2024年3月2日

【leetcode】2368. 受限條件下可到達節點的數目

題意:

現有一棵由 n 個節點組成的無向樹,節點編號從 0n - 1 ,共有 n - 1 條邊。

給你一個二維整數陣列 edges ,長度為 n - 1 ,其中 edges[i] = [ai, bi] 表示樹中節點 aibi 之間存在一條邊。另給你一個整數陣列 restricted 表示 受限 節點。

在不訪問受限節點的前提下,返回你可以從節點 0 到達的 最多 節點數目

注意,節點 0 會標記為受限節點。




2024年3月3日

【leetcode】225. 用佇列實現棧

題意:

請你僅使用兩個佇列實現一個後入先出(LIFO)的棧,並支援普通棧的全部四種操作(pushtoppopempty)。

實現 MyStack 類:

  • void push(int x) 將元素 x 壓入棧頂。
  • int pop() 移除並返回棧頂元素。
  • int top() 返回棧頂元素。
  • boolean empty() 如果棧是空的,返回 true ;否則,返回 false

注意:

  • 你只能使用佇列的基本操作 —— 也就是 push to backpeek/pop from frontsizeis empty 這些操作。
  • 你所使用的語言也許不支援佇列。 你可以使用 list (列表)或者 deque(雙端佇列)來模擬一個佇列 , 只要是標準的佇列操作即可。



2024年3月4日

【leetcode】232. 用棧實現佇列

題意:

請你僅使用兩個棧實現先入先出佇列。佇列應當支援一般佇列支援的所有操作(pushpoppeekempty):

實現 MyQueue 類:

  • void push(int x) 將元素 x 推到佇列的末尾
  • int pop() 從佇列的開頭移除並返回元素
  • int peek() 返回佇列開頭的元素
  • boolean empty() 如果佇列為空,返回 true ;否則,返回 false

說明:

  • 只能 使用標準的棧操作 —— 也就是隻有 push to top, peek/pop from top, size, 和 is empty 操作是合法的。
  • 你所使用的語言也許不支援棧。你可以使用 list 或者 deque(雙端佇列)來模擬一個棧,只要是標準的棧操作即可。



2024年3月5日

【leetcode】1976. 到達目的地的方案數

題意:

你在一個城市裡,城市由 n 個路口組成,路口編號為 0n - 1 ,某些路口之間有 雙向 道路。輸入保證你可以從任意路口出發到達其他任意路口,且任意兩個路口之間最多有一條路。

給你一個整數 n 和二維整數陣列 roads ,其中 roads[i] = [ui, vi, timei] 表示在路口 uivi 之間有一條需要花費 timei 時間才能透過的道路。你想知道花費 最少時間 從路口 0 出發到達路口 n - 1 的方案數。

請返回花費 最少時間 到達目的地的 路徑數目 。由於答案可能很大,將結果對 10^9 + 7 取餘 後返回。




2024年3月6日

【leetcode】2917. 找出陣列中的 K-or 值

題意:

給你一個下標從 0 開始的整數陣列 nums 和一個整數 k

nums 中的 K-or 是一個滿足以下條件的非負整數:

  • 只有在 nums 中,至少存在 k 個元素的第 i 位值為 1 ,那麼 K-or 中的第 i 位的值才是 1 。

返回 numsK-or 值。

注意 :對於整數 x ,如果 (2^i AND x) == 2^i ,則 x 中的第 i 位值為 1 ,其中 AND 為按位與運算子。




2024年3月7日

【leetcode】2575. 找出字串的可整除陣列

題意:

給你一個下標從 0 開始的字串 word ,長度為 n ,由從 09 的數字組成。另給你一個正整數 m

word可整除陣列 div 是一個長度為 n 的整數陣列,並滿足:

  • 如果 word[0,...,i] 所表示的 數值 能被 m 整除,div[i] = 1
  • 否則,div[i] = 0

返回 word 的可整除陣列。




2024年3月8日

【leetcode】2834. 找出美麗陣列的最小和

題意:

給你兩個正整數:ntarget

如果陣列 nums 滿足下述條件,則稱其為 美麗陣列

  • nums.length == n.
  • nums 由兩兩互不相同的正整陣列成。
  • 在範圍 [0, n-1] 內,不存在 兩個 不同 下標 ij ,使得 nums[i] + nums[j] == target

返回符合條件的美麗陣列所可能具備的 最小 和,並對結果進行取模 10^9 + 7




2024年3月10日

【leetcode】299. 猜數字遊戲

題意:

你在和朋友一起玩 猜數字(Bulls and Cows)遊戲,該遊戲規則如下:

寫出一個秘密數字,並請朋友猜這個數字是多少。朋友每猜測一次,你就會給他一個包含下述資訊的提示:

  • 猜測數字中有多少位屬於數字和確切位置都猜對了(稱為 "Bulls",公牛),
  • 有多少位屬於數字猜對了但是位置不對(稱為 "Cows",奶牛)。也就是說,這次猜測中有多少位非公牛數字可以透過重新排列轉換成公牛數字。

給你一個秘密數字 secret 和朋友猜測的數字 guess ,請你返回對朋友這次猜測的提示。

提示的格式為 "xAyB"x 是公牛個數, y 是奶牛個數,A 表示公牛,B 表示奶牛。

請注意秘密數字和朋友猜測的數字都可能含有重複數字。




2024年3月11日

【leetcode】2129. 將標題首字母大寫

題意:

給你一個字串 title ,它由單個空格連線一個或多個單片語成,每個單詞都只包含英文字母。請你按以下規則將每個單詞的首字母 大寫

  • 如果單詞的長度為 1 或者 2 ,所有字母變成小寫。
  • 否則,將單詞首字母大寫,剩餘字母變成小寫。

請你返回 大寫後title




2024年3月12日

【leetcode】1261. 在受汙染的二叉樹中查詢元素

題意:

給出一個滿足下述規則的二叉樹:

  1. root.val == 0
  2. 如果 treeNode.val == xtreeNode.left != null,那麼 treeNode.left.val == 2 * x + 1
  3. 如果 treeNode.val == xtreeNode.right != null,那麼 treeNode.right.val == 2 * x + 2

現在這個二叉樹受到「汙染」,所有的 treeNode.val 都變成了 -1

請你先還原二叉樹,然後實現 FindElements 類:

  • FindElements(TreeNode* root) 用受汙染的二叉樹初始化物件,你需要先把它還原。
  • bool find(int target) 判斷目標值 target 是否存在於還原後的二叉樹中並返回結果。



2024年3月13日

【leetcode】2864. 最大二進位制奇數

題意:

給你一個 二進位制 字串 s ,其中至少包含一個 '1'

你必須按某種方式 重新排列 字串中的位,使得到的二進位制數字是可以由該組合生成的 最大二進位制奇數

以字串形式,表示並返回可以由給定組合生成的最大二進位制奇數。

注意 返回的結果字串 可以 含前導零。




2024年3月14日

【leetcode】2789. 合併後陣列中的最大元素

題意:

給你一個下標從 0 開始、由正整陣列成的陣列 nums

你可以在陣列上執行下述操作 任意 次:

  • 選中一個同時滿足 0 <= i < nums.length - 1nums[i] <= nums[i + 1] 的整數 i 。將元素 nums[i + 1] 替換為 nums[i] + nums[i + 1] ,並從陣列中刪除元素 nums[i]

返回你可以從最終陣列中獲得的 最大 元素的值。




2024年3月16日

【leetcode】2684. 矩陣中移動的最大次數

題意:

給你一個下標從 0 開始、大小為 m x n 的矩陣 grid ,矩陣由若干 整陣列成。

你可以從矩陣第一列中的 任一 單元格出發,按以下方式遍歷 grid

  • 從單元格 (row, col) 可以移動到 (row - 1, col + 1)(row, col + 1)(row + 1, col + 1) 三個單元格中任一滿足值 嚴格 大於當前單元格的單元格。

返回你在矩陣中能夠 移動最大 次數。




2024年3月17日

【leetcode】310. 最小高度樹

題意:

樹是一個無向圖,其中任何兩個頂點只透過一條路徑連線。 換句話說,一個任何沒有簡單環路的連通圖都是一棵樹。

給你一棵包含 n 個節點的樹,標記為 0n - 1 。給定數字 n 和一個有 n - 1 條無向邊的 edges 列表(每一個邊都是一對標籤),其中 edges[i] = [ai, bi] 表示樹中節點 aibi 之間存在一條無向邊。

可選擇樹中任何一個節點作為根。當選擇節點 x 作為根節點時,設結果樹的高度為 h 。在所有可能的樹中,具有最小高度的樹(即,min(h))被稱為 最小高度樹

請你找到所有的 最小高度樹 並按 任意順序 返回它們的根節點標籤列表。

樹的 高度 是指根節點和葉子節點之間最長向下路徑上邊的數量。




2024年3月18日

【leetcode】303. 區域和檢索 - 陣列不可變

題意:

給定一個整數陣列 nums,處理以下型別的多個查詢:

  1. 計算索引 leftright (包含 leftright)之間的 nums 元素的 ,其中 left <= right

實現 NumArray 類:

  • NumArray(int[] nums) 使用陣列 nums 初始化物件
  • int sumRange(int i, int j) 返回陣列 nums 中索引 leftright 之間的元素的 總和 ,包含 leftright 兩點(也就是 nums[left] + nums[left + 1] + ... + nums[right] )



2024年3月19日

【leetcode】160. 相交連結串列

題意:

給你兩個單連結串列的頭節點 headAheadB ,請你找出並返回兩個單連結串列相交的起始節點。如果兩個連結串列不存在相交節點,返回 null

題目資料 保證 整個鏈式結構中不存在環。

注意,函式返回結果後,連結串列必須 保持其原始結構




2024年3月20日

【leetcode】1969. 陣列元素的最小非零乘積

題意:

給你一個正整數 p 。你有一個下標從 1 開始的陣列 nums ,這個陣列包含範圍 [1, 2p - 1] 內所有整數的二進位制形式(兩端都 包含)。你可以進行以下操作 任意 次:

  • nums 中選擇兩個元素 xy
  • 選擇 x 中的一位與 y 對應位置的位交換。對應位置指的是兩個整數 相同位置 的二進位制位。

比方說,如果 x = 11*0*1y = 00*1*1 ,交換右邊數起第 2 位後,我們得到 x = 11*1*1y = 00*0*1

請你算出進行以上操作 任意次 以後,nums 能得到的 最小非零 乘積。將乘積對 109 + 7 取餘 後返回。

注意:答案應為取餘 之前 的最小值。




2024年3月21日

【leetcode】2671. 頻率跟蹤器

題意:

請你設計並實現一個能夠對其中的值進行跟蹤的資料結構,並支援對頻率相關查詢進行應答。

實現 FrequencyTracker 類:

  • FrequencyTracker():使用一個空陣列初始化 FrequencyTracker 物件。
  • void add(int number):新增一個 number 到資料結構中。
  • void deleteOne(int number):從資料結構中刪除一個 number 。資料結構 可能不包含 number ,在這種情況下不刪除任何內容。
  • bool hasFrequency(int frequency): 如果資料結構中存在出現 frequency 次的數字,則返回 true,否則返回 false



2024年3月23日

【leetcode】2549. 統計桌面上的不同數字

題意:

給你一個正整數 n ,開始時,它放在桌面上。在 109 天內,每天都要執行下述步驟:

  • 對於出現在桌面上的每個數字 x ,找出符合 1 <= i <= n 且滿足 x % i == 1 的所有數字 i
  • 然後,將這些數字放在桌面上。

返回在 109 天之後,出現在桌面上的 不同 整數的數目。

注意:

  • 一旦數字放在桌面上,則會一直保留直到結束。
  • % 表示取餘運算。例如,14 % 3 等於 2



2024年3月24日

【leetcode】322. 零錢兌換

題意:

給你一個整數陣列 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。

計算並返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回 -1

你可以認為每種硬幣的數量是無限的。




2024年3月25日

【leetcode】518. 零錢兌換 II

題意:

給你一個整數陣列 coins 表示不同面額的硬幣,另給一個整數 amount 表示總金額。

請你計算並返回可以湊成總金額的硬幣組合數。如果任何硬幣組合都無法湊出總金額,返回 0

假設每一種面額的硬幣有無限個。

題目資料保證結果符合 32 位帶符號整數。




2024年3月26日

【leetcode】2642. 設計可以求最短路徑的圖類

題意:

給你一個有 n 個節點的 有向帶權 圖,節點編號為 0n - 1 。圖中的初始邊用陣列 edges 表示,其中 edges[i] = [fromi, toi, edgeCosti] 表示從 fromitoi 有一條代價為 edgeCosti 的邊。

請你實現一個 Graph 類:

  • Graph(int n, int[][] edges) 初始化圖有 n 個節點,並輸入初始邊。
  • addEdge(int[] edge) 向邊集中新增一條邊,其中 edge = [from, to, edgeCost] 。資料保證新增這條邊之前對應的兩個節點之間沒有有向邊。
  • int shortestPath(int node1, int node2) 返回從節點 node1node2 的路徑 最小 代價。如果路徑不存在,返回 -1 。一條路徑的代價是路徑中所有邊代價之和。



2024年3月27日

【leetcode】2580. 統計將重疊區間合併成組的方案數

題意:

給你一個二維整數陣列 ranges ,其中 ranges[i] = [starti, endi] 表示 startiendi 之間(包括二者)的所有整數都包含在第 i 個區間中。

你需要將 ranges 分成 兩個 組(可以為空),滿足:

  • 每個區間只屬於一個組。
  • 兩個有 交集 的區間必須在 同一個 組內。

如果兩個區間有至少 一個 公共整數,那麼這兩個區間是 有交集 的。

  • 比方說,區間 [1, 3][2, 5] 有交集,因為 23 在兩個區間中都被包含。

請你返回將 ranges 劃分成兩個組的 總方案數 。由於答案可能很大,將它對 10^9 + 7 取餘 後返回。




2024年3月28日

【leetcode】1997. 訪問完所有房間的第一天

題意:

你需要訪問 n 個房間,房間從 0n - 1 編號。同時,每一天都有一個日期編號,從 0 開始,依天數遞增。你每天都會訪問一個房間。

最開始的第 0 天,你訪問 0 號房間。給你一個長度為 n下標從 0 開始 的陣列 nextVisit 。在接下來的幾天中,你訪問房間的 次序 將根據下面的 規則 決定:

  • 假設某一天,你訪問 i 號房間。
  • 如果算上本次訪問,訪問 i 號房間的次數為 奇數 ,那麼 第二天 需要訪問 nextVisit[i] 所指定的房間,其中 0 <= nextVisit[i] <= i
  • 如果算上本次訪問,訪問 i 號房間的次數為 偶數 ,那麼 第二天 需要訪問 (i + 1) mod n 號房間。

請返回你訪問完所有房間的第一天的日期編號。題目資料保證總是存在這樣的一天。由於答案可能很大,返回對 10^9 + 7 取餘後的結果。




2024年3月29日

【leetcode】2908. 元素和最小的山形三元組 I

題意:

給你一個下標從 0 開始的整數陣列 nums

如果下標三元組 (i, j, k) 滿足下述全部條件,則認為它是一個 山形三元組

  • i < j < k
  • nums[i] < nums[j]nums[k] < nums[j]

請你找出 nums元素和最小 的山形三元組,並返回其 元素和 。如果不存在滿足條件的三元組,返回 -1




2024年3月30日

【leetcode】2952. 需要新增的硬幣的最小數量

題意:

給你一個下標從 0 開始的整數陣列 coins,表示可用的硬幣的面值,以及一個整數 target

如果存在某個 coins 的子序列總和為 x,那麼整數 x 就是一個 可取得的金額

返回需要新增到陣列中的 任意麵值 硬幣的 最小數量 ,使範圍 [1, target] 內的每個整數都屬於 可取得的金額

陣列的 子序列 是透過刪除原始陣列的一些(可能不刪除)元素而形成的新的 非空 陣列,刪除過程不會改變剩餘元素的相對位置。




2024年3月31日

【leetcode】331. 驗證二叉樹的前序序列化

題意:

序列化二叉樹的一種方法是使用 前序遍歷 。當我們遇到一個非空節點時,我們可以記錄下這個節點的值。如果它是一個空節點,我們可以使用一個標記值記錄,例如 #

給定一串以逗號分隔的序列,驗證它是否是正確的二叉樹的前序序列化。編寫一個在不重構樹的條件下的可行演算法。

保證 每個以逗號分隔的字元或為一個整數或為一個表示 null 指標的 '#'

你可以認為輸入格式總是有效的

  • 例如它永遠不會包含兩個連續的逗號,比如 "1,,3"

注意:不允許重建樹。