2024年3月1日
【leetcode】2369. 檢查陣列是否存在有效劃分
題意:
給你一個下標從 0 開始的整數陣列
nums
,你必須將陣列劃分為一個或多個 連續 子陣列。如果獲得的這些子陣列中每個都能滿足下述條件 之一 ,則可以稱其為陣列的一種 有效 劃分:
- 子陣列 恰 由
2
個相等元素組成,例如,子陣列[2,2]
。- 子陣列 恰 由
3
個相等元素組成,例如,子陣列[4,4,4]
。- 子陣列 恰 由
3
個連續遞增元素組成,並且相鄰元素之間的差值為1
。例如,子陣列[3,4,5]
,但是子陣列[1,3,5]
不符合要求。如果陣列 至少 存在一種有效劃分,返回
true
,否則,返回false
。
2024年3月2日
【leetcode】2368. 受限條件下可到達節點的數目
題意:
現有一棵由
n
個節點組成的無向樹,節點編號從0
到n - 1
,共有n - 1
條邊。給你一個二維整數陣列
edges
,長度為n - 1
,其中edges[i] = [ai, bi]
表示樹中節點ai
和bi
之間存在一條邊。另給你一個整數陣列restricted
表示 受限 節點。在不訪問受限節點的前提下,返回你可以從節點
0
到達的 最多 節點數目。注意,節點
0
不 會標記為受限節點。
2024年3月3日
【leetcode】225. 用佇列實現棧
題意:
請你僅使用兩個佇列實現一個後入先出(LIFO)的棧,並支援普通棧的全部四種操作(
push
、top
、pop
和empty
)。實現
MyStack
類:
void push(int x)
將元素 x 壓入棧頂。int pop()
移除並返回棧頂元素。int top()
返回棧頂元素。boolean empty()
如果棧是空的,返回true
;否則,返回false
。注意:
- 你只能使用佇列的基本操作 —— 也就是
push to back
、peek/pop from front
、size
和is empty
這些操作。- 你所使用的語言也許不支援佇列。 你可以使用 list (列表)或者 deque(雙端佇列)來模擬一個佇列 , 只要是標準的佇列操作即可。
2024年3月4日
【leetcode】232. 用棧實現佇列
題意:
請你僅使用兩個棧實現先入先出佇列。佇列應當支援一般佇列支援的所有操作(
push
、pop
、peek
、empty
):實現
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
個路口組成,路口編號為0
到n - 1
,某些路口之間有 雙向 道路。輸入保證你可以從任意路口出發到達其他任意路口,且任意兩個路口之間最多有一條路。給你一個整數
n
和二維整數陣列roads
,其中roads[i] = [ui, vi, timei]
表示在路口ui
和vi
之間有一條需要花費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 。返回
nums
的 K-or 值。注意 :對於整數
x
,如果(2^i AND x) == 2^i
,則x
中的第i
位值為 1 ,其中AND
為按位與運算子。
2024年3月7日
【leetcode】2575. 找出字串的可整除陣列
題意:
給你一個下標從 0 開始的字串
word
,長度為n
,由從0
到9
的數字組成。另給你一個正整數m
。
word
的 可整除陣列div
是一個長度為n
的整數陣列,並滿足:
- 如果
word[0,...,i]
所表示的 數值 能被m
整除,div[i] = 1
- 否則,
div[i] = 0
返回
word
的可整除陣列。
2024年3月8日
【leetcode】2834. 找出美麗陣列的最小和
題意:
給你兩個正整數:
n
和target
。如果陣列
nums
滿足下述條件,則稱其為 美麗陣列 。
nums.length == n
.nums
由兩兩互不相同的正整陣列成。- 在範圍
[0, n-1]
內,不存在 兩個 不同 下標i
和j
,使得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. 在受汙染的二叉樹中查詢元素
題意:
給出一個滿足下述規則的二叉樹:
root.val == 0
- 如果
treeNode.val == x
且treeNode.left != null
,那麼treeNode.left.val == 2 * x + 1
- 如果
treeNode.val == x
且treeNode.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 - 1
和nums[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
個節點的樹,標記為0
到n - 1
。給定數字n
和一個有n - 1
條無向邊的edges
列表(每一個邊都是一對標籤),其中edges[i] = [ai, bi]
表示樹中節點ai
和bi
之間存在一條無向邊。可選擇樹中任何一個節點作為根。當選擇節點
x
作為根節點時,設結果樹的高度為h
。在所有可能的樹中,具有最小高度的樹(即,min(h)
)被稱為 最小高度樹 。請你找到所有的 最小高度樹 並按 任意順序 返回它們的根節點標籤列表。
樹的 高度 是指根節點和葉子節點之間最長向下路徑上邊的數量。
2024年3月18日
【leetcode】303. 區域和檢索 - 陣列不可變
題意:
給定一個整數陣列
nums
,處理以下型別的多個查詢:
- 計算索引
left
和right
(包含left
和right
)之間的nums
元素的 和 ,其中left <= right
實現
NumArray
類:
NumArray(int[] nums)
使用陣列nums
初始化物件int sumRange(int i, int j)
返回陣列nums
中索引left
和right
之間的元素的 總和 ,包含left
和right
兩點(也就是nums[left] + nums[left + 1] + ... + nums[right]
)
2024年3月19日
【leetcode】160. 相交連結串列
題意:
給你兩個單連結串列的頭節點
headA
和headB
,請你找出並返回兩個單連結串列相交的起始節點。如果兩個連結串列不存在相交節點,返回null
。題目資料 保證 整個鏈式結構中不存在環。
注意,函式返回結果後,連結串列必須 保持其原始結構 。
2024年3月20日
【leetcode】1969. 陣列元素的最小非零乘積
題意:
給你一個正整數
p
。你有一個下標從 1 開始的陣列nums
,這個陣列包含範圍[1, 2p - 1]
內所有整數的二進位制形式(兩端都 包含)。你可以進行以下操作 任意 次:
- 從
nums
中選擇兩個元素x
和y
。- 選擇
x
中的一位與y
對應位置的位交換。對應位置指的是兩個整數 相同位置 的二進位制位。比方說,如果
x = 11*0*1
且y = 00*1*1
,交換右邊數起第2
位後,我們得到x = 11*1*1
和y = 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
個節點的 有向帶權 圖,節點編號為0
到n - 1
。圖中的初始邊用陣列edges
表示,其中edges[i] = [fromi, toi, edgeCosti]
表示從fromi
到toi
有一條代價為edgeCosti
的邊。請你實現一個
Graph
類:
Graph(int n, int[][] edges)
初始化圖有n
個節點,並輸入初始邊。addEdge(int[] edge)
向邊集中新增一條邊,其中edge = [from, to, edgeCost]
。資料保證新增這條邊之前對應的兩個節點之間沒有有向邊。int shortestPath(int node1, int node2)
返回從節點node1
到node2
的路徑 最小 代價。如果路徑不存在,返回-1
。一條路徑的代價是路徑中所有邊代價之和。
2024年3月27日
【leetcode】2580. 統計將重疊區間合併成組的方案數
題意:
給你一個二維整數陣列
ranges
,其中ranges[i] = [starti, endi]
表示starti
到endi
之間(包括二者)的所有整數都包含在第i
個區間中。你需要將
ranges
分成 兩個 組(可以為空),滿足:
- 每個區間只屬於一個組。
- 兩個有 交集 的區間必須在 同一個 組內。
如果兩個區間有至少 一個 公共整數,那麼這兩個區間是 有交集 的。
- 比方說,區間
[1, 3]
和[2, 5]
有交集,因為2
和3
在兩個區間中都被包含。請你返回將
ranges
劃分成兩個組的 總方案數 。由於答案可能很大,將它對10^9 + 7
取餘 後返回。
2024年3月28日
【leetcode】1997. 訪問完所有房間的第一天
題意:
你需要訪問
n
個房間,房間從0
到n - 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"
。注意:不允許重建樹。