2024年4月1日
【leetcode】2810. 故障鍵盤
題意:
你的筆記本鍵盤存在故障,每當你在上面輸入字元
'i'
時,它會反轉你所寫的字串。而輸入其他字元則可以正常工作。給你一個下標從 0 開始的字串
s
,請你用故障鍵盤依次輸入每個字元。返回最終筆記本螢幕上輸出的字串。
2024年4月2日
【leetcode】894. 所有可能的真二叉樹
題意:
給你一個整數
n
,請你找出所有可能含n
個節點的 真二叉樹 ,並以列表形式返回。答案中每棵樹的每個節點都必須符合Node.val == 0
。答案的每個元素都是一棵真二叉樹的根節點。你可以按 任意順序 返回最終的真二叉樹列表。
真二叉樹 是一類二叉樹,樹中每個節點恰好有
0
或2
個子節點。
2024年4月3日
【leetcode】1379. 找出克隆二叉樹中的相同節點
題意:
給你兩棵二叉樹,原始樹
original
和克隆樹cloned
,以及一個位於原始樹original
中的目標節點target
。其中,克隆樹
cloned
是原始樹original
的一個 副本 。請找出在樹
cloned
中,與target
相同 的節點,並返回對該節點的引用(在 C/C++ 等有指標的語言中返回 節點指標,其他語言返回節點本身)。注意:你 不能 對兩棵二叉樹,以及
target
節點進行更改。只能 返回對克隆樹cloned
中已有的節點的引用。
2024年4月4日
【leetcode】2192. 有向無環圖中一個節點的所有祖先
題意:
給你一個正整數
n
,它表示一個 有向無環圖 中節點的數目,節點編號為0
到n - 1
(包括兩者)。給你一個二維整數陣列
edges
,其中edges[i] = [from_i, to_i]
表示圖中一條從from_i
到to_i
的單向邊。請你返回一個陣列
answer
,其中answer[i]
是第i
個節點的所有 祖先 ,這些祖先節點 升序 排序。如果
u
透過一系列邊,能夠到達v
,那麼我們稱節點u
是節點v
的 祖先 節點。
2024年4月5日
【leetcode】1026. 節點與其祖先之間的最大差值
題意:
給定二叉樹的根節點
root
,找出存在於 不同 節點A
和B
之間的最大值V
,其中V = |A.val - B.val|
,且A
是B
的祖先。(如果 A 的任何子節點之一為 B,或者 A 的任何子節點是 B 的祖先,那麼我們認為 A 是 B 的祖先)
2024年4月6日
【leetcode】1483. 樹節點的第 K 個祖先
題意:
給你一棵樹,樹上有
n
個節點,按從0
到n-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 組成。
- 一開始,
curOrder
為["king"]
.- 呼叫
Successor(king, curOrder)
,返回 Alice ,所以我們將 Alice 放入curOrder
中,得到["king", "Alice"]
。- 呼叫
Successor(Alice, curOrder)
,返回 Jack ,所以我們將 Jack 放入curOrder
中,得到["king", "Alice", "Jack"]
。- 呼叫
Successor(Jack, curOrder)
,返回 Bob ,所以我們將 Bob 放入curOrder
中,得到["king", "Alice", "Jack", "Bob"]
。- 呼叫
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
,返回pos
和neg
二者中的最大值。注意:
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
個節點的樹(也就是一個無環連通無向圖),節點編號從0
到n - 1
,且恰好有n - 1
條邊,每個節點有一個值。樹的 根節點 為 0 號點。給你一個整數陣列
nums
和一個二維陣列edges
來表示這棵樹。nums[i]
表示第i
個點的值,edges[j] = [uj, vj]
表示節點uj
和節點vj
在樹中有一條邊。當
gcd(x, y) == 1
,我們稱兩個數x
和y
是 互質的 ,其中gcd(x, y)
是x
和y
的 最大公約數 。從節點
i
到 根 最短路徑上的點都是節點i
的祖先節點。一個節點 不是 它自己的祖先節點。請你返回一個大小為
n
的陣列ans
,其中ans[i]
是離節點i
最近的祖先節點且滿足nums[i]
和nums[ans[i]]
是 互質的 ,如果不存在這樣的祖先節點,ans[i]
為-1
。
2024年4月12日
【leetcode】2923. 找到冠軍 I
題意:
一場比賽中共有
n
支隊伍,按從0
到n - 1
編號。給你一個下標從 0 開始、大小為
n * n
的二維布林矩陣grid
。對於滿足0 <= i, j <= n - 1
且i != j
的所有i, j
:如果grid[i][j] == 1
,那麼i
隊比j
隊 強 ;否則,j
隊比i
隊 強 。在這場比賽中,如果不存在某支強於
a
隊的隊伍,則認為a
隊將會是 冠軍 。返回這場比賽中將會成為冠軍的隊伍。
2024年4月13日
【leetcode】2924. 找到冠軍 II
題意:
一場比賽中共有
n
支隊伍,按從0
到n - 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
題意:
找出所有相加之和為
n
的k
個數的組合,且滿足下列條件:
- 只使用數字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. 組合
題意:
給定兩個整數
n
和k
,返回範圍[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. 將矩陣按對角線排序
題意:
矩陣對角線 是一條從矩陣最上面行或者最左側列中的某個元素開始的對角線,沿右下方向一直到矩陣末尾的元素。例如,矩陣
mat
有6
行3
列,從mat[2][0]
開始的 矩陣對角線 將會經過mat[2][0]
、mat[3][1]
和mat[4][2]
。給你一個
m * n
的整數矩陣mat
,請你將同一條 矩陣對角線 上的元素按升序排序後,返回排好序的矩陣。
2024年4月30日
【leetcode】2798. 滿足目標工作時長的員工數目
題意:
公司裡共有
n
名員工,按從0
到n - 1
編號。每個員工i
已經在公司工作了hours[i]
小時。公司要求每位員工工作 至少
target
小時。給你一個下標從 0 開始、長度為
n
的非負整數陣列hours
和一個非負整數target
。請你用整數表示並返回工作至少
target
小時的員工數。