[Leetcode解題] 2563. Count the Number of Fair Pairs
題目
2563. Count the Number of Fair Pairs
給定一個矩陣,以及上界(upper bound)跟下界(lower bound),找一對數字相加後介於之間,求符合條件之數目。
[Leetcode解題] 92. Reverse Linked List II
題目
92. Reverse Linked List II
給定一個單向鏈表的頭節點 head
,以及兩個整數 left
和 right
,其中 1 <= left <= right <= 鏈表長度
。請反轉從位置 left
到 right
的節點(從 1 開始計數),並返回修改後的鏈表頭節點。
[Leetcode解題] 1894. Find the Student that Will Replace the Chalk
題目
老師有一盒粉筆,一開始有 $k$ 支,會依照順序讓編號 $0$ 到 $n-1$ 的學生輪流解題,每個學生解一題會消耗不同數量的粉筆(由 chalk
陣列提供)。當某個學生發現粉筆數量不足,這個學生就要去補充粉筆,我們要找出這位學生的索引。
[Leetcode解題] 2364. Count Number of Bad Pairs
題目
2364. Count Number of Bad Pairs
給定一個矩陣,如果矩陣內有符合以下條件的情況,則為一組bad pairs
j - i != nums[j] - nums[i]
求總共有幾組bad pairs
[Leetcode解題] 845. Longest Mountain in Array
題目
845. Longest Mountain in Array 一個數列如果滿足 山脈數列 (mountain array)的條件,需要滿足下列條件:
- 數列長度至少是 3:
arr.length >= 3
- 存在一個索引
i
(以 0 為基準,0 < i < arr.length - 1
),使得:arr[0] < arr[1] < ... < arr[i - 1] < arr[i]
arr[i] > arr[i + 1] > ... > arr[arr.length - 1]
現在,給你一個數列 arr
,請返回最長山脈子數列的長度。如果沒有山脈子數列,則返回 0
。
[Leetcode解題] 80. Remove Duplicates from Sorted Array II
題目
80. Remove Duplicates from Sorted Array II
給定一個按非遞減順序排序的整數陣列 nums
,請移除部分重複的元素,使得每個元素最多出現兩次,且元素的相對順序保持不變。
如果移除重複後剩下 k
個元素,則 nums
的前 k
個位置應該包含最終的結果。在 k
之後的部分內容則不重要。
不可以使用額外的陣列空間,必須以 $O(1)$ 的額外記憶體inplace修改輸入陣列。
[Leetcode解題] 1930. Unique Length-3 Palindromic Subsequences
1930. Unique Length-3 Palindromic Subsequences
題目
1930. Unique Length-3 Palindromic Subsequences
這題給一個字串,我們要求所有長度為3的回文sub-sequence,並且如果重複的話只算一次,求有幾種可能?
[Leetcode解題] 62. Unique Paths
題目
62. Unique Paths 一個機器人位於 $m \times n$ 的網格的左上角(即 $\text{grid}[0][0]$)。機器人嘗試移動到網格的右下角(即 $\text{grid}[m - 1][n - 1]$)。在任意時刻,機器人只能向下或向右移動。
給定兩個整數 $m$ 和 $n$,返回機器人從左上角移動到右下角的所有唯一路徑的數量。
約束條件:
測試數據保證答案小於等於 $2 \times 10^9$。
[Leetcode解題] 1702. Maximum Binary String After Change
題目
1702. Maximum Binary String After Change
這題給一個binary字串,並有兩種操作可以進行:
- 將
00
轉成10
- 將
10
轉成01
操作次數不限,問我們可以得到的最大字串為何
[Leetcode解題] 150. Evaluate Reverse Polish Notation
150. Evaluate Reverse Polish Notation
題目
150. Evaluate Reverse Polish Notation
給你一個以 逆波蘭表示法(Reverse Polish Notation, RPN) 表示的算術運算式,tokens
是一個字串陣列,代表這個算術表達式。請你計算並回傳該運算式的結果,保證結果和中間運算過程中的所有數字都可以用 32 位元整數表示。
[Leetcode解題] 2554. Maximum Number of Integers to Choose From a Range I
題目
2554. Maximum Number of Integers to Choose From a Range I
給定一個陣列banned
,以及兩個正整數n
以及maxSum
,我們可以從1到n之間挑選盡可能多的正整數,除了banned
裡面的正整數不能選以外,而這些被挑選的正整數和不能超過maxSum
,問最多能挑選幾個數字。
[Leetcode解題] 2055. Plates Between Candles
題目
有一張長桌,上面擺了一排盤子和蠟燭。用一個由 '*'
(代表盤子)和 '|'
(代表蠟燭)組成的字串 s
來描述桌上的擺設。另外會給你一組查詢 queries
,裡面每筆查詢是 [left, right]
,代表要檢查子字串 s[left...right]
之間的盤子數量。
條件是,這些盤子必須同時有蠟燭在左邊和右邊才算數。
比如說:
s = "||**||**|*"
, 查詢[3, 8]
的子字串是"*||**|"
,只有兩個盤子符合條件,因為兩邊都有蠟燭。
[Leetcode解題] 3254. Find the Power of K-Size Subarrays I
題目
3254. Find the Power of K-Size Subarrays I
這題要求找到長度為 $𝑘$ 的所有子陣列的「power」
陣列的「power」定義為:如果這個子陣列的元素是連續遞增的,則返回其最大元素;否則返回 -1。我們需要遍歷所有長度為 $k$ 的子陣列,並返回一個結果陣列,其中每個元素是對應子陣列的「power」。
[Leetcode解題] 75. Sort Colors
75. Sort Colors
題目
75. Sort Colors
給定一個長度為 $n$ 的整數陣列 nums
,其中每個數字表示一種顏色:0
表示紅色,1
表示白色,2
表示藍色。請將陣列中的顏色進行原地排序,使得相同顏色的物件彼此相鄰,並且排列順序依次為紅色、白色和藍色。
注意:不能使用內建的sort
函數來解決此問題。
[Leetcode解題] 50. Pow(x, n)
題目描述
50. Pow(x, n) 這題要實作一個指數計算函數 pow(x, n)
,這個函數會計算並回傳 x
的 n
次方,也就是 $x^n$。n
可以是正數、零、或負數,並且 x
可能是小數(例如 2.5)。
[Leetcode解題] 210. Course Schedule II
題目
210. Course Schedule II
給定一個包含 numCourses
門課程的課程表,課程標號從 0
到 numCourses - 1
。同時,還有一個「先修課程」陣列 prerequisites
,其中 prerequisites[i] = [a_i, b_i]
表示想要修課程 a_i
,需要先修完課程 b_i
。
例如,[0, 1]
表示要修課程 0
必須先修課程 1
。
你需要返回一個修課程的順序,若有多種有效順序,返回任意一個。若無法修完所有課程,返回空陣列。
[Leetcode解題] 1302. Deepest Leaves Sum
題目
這題給定一顆Binary Tree,要求最深的Leaves值的總和
解題思路
這題最直觀的解法是先Traverse一次樹得到最深深度,然後再Traverse一次去計算最深深度的Leaves的總和
但我們也能直接在第一次Traverse的時候就記錄下最深的Leaves,可以直遍歷一次樹
所以我們透過BFS來做,用一個queue來存每個點跟每個點的level,然後去計算每個depth所有點的總和
但如果發現還可以往下的話,就洗掉這個總和,所以它永遠存的是最深的level(depth)點的總和
另外,也能透過多加一個內層迴圈,每次都只對當層來做和,這樣就不用像下面的程式碼存level的值了,大家有興趣可以自己implement看看
[Leetcode解題] 1110. Delete Nodes And Return Forest - DFS解
題目
1110. Delete Nodes And Return Forest
當你有一棵二元樹,其中每個節點的值都不一樣,我們的目標是刪除一些節點,這些節點的值在一個叫 to_delete
的列表裡。當這些節點被刪除後,樹會被分成幾個不連接的小樹,這些小樹被稱為森林。你需要返回這些小樹的根節點,順序沒有關係。
[Leetcode解題] 381. Insert Delete GetRandom O(1) - Duplicates allowed
381. Insert Delete GetRandom O(1) - Duplicates allowed
題目描述
381. Insert Delete GetRandom O(1) - Duplicates allowed
RandomizedCollection
是一個支援重複元素(multiset)的數據結構,需要支援以下三種操作:
bool insert(int val)
:將元素val
插入到集合中,即使該元素已存在。返回值為true
當該元素之前不在集合中,否則返回false
。bool remove(int val)
:從集合中移除一個val
,如果val
存在,則返回true
,否則返回false
。如果有多個相同元素,只移除其中一個。int getRandom()
:隨機返回集合中的一個元素。每個元素被返回的機率應與它在集合中的出現次數成正比。
要求所有操作在平均 $O(1)$ 的時間複雜度內完成。
[Leetcode解題] 2419. Longest Subarray With Maximum Bitwise AND
題目
2419. Longest Subarray With Maximum Bitwise AND
給定一個大小為 n 的整數數組 nums。
考慮 nums 中一個非空的子數組,其按位與(bitwise AND)的值是可能的最大值。
換句話說,設 k 為任意子數組的最大按位與值,然後只考慮按位與等於 k 的子數組。返回這樣的子數組中最長的長度。
數組的按位與是數組中所有數的按位與操作結果。
子數組是數組中連續的元素序列。
[Leetcode解題] 841. Keys and Rooms
題目
有 n 個房間,標號從 0 到 n-1,除了房間 0 之外,所有房間都被鎖住。你的目標是訪問所有房間,但沒有鑰匙你無法進入被鎖的房間。
當你訪問一個房間時,可能會找到一組不同的鑰匙,每把鑰匙上都有一個數字,表示它可以打開的房間,你可以帶上所有鑰匙去打開其他房間。
給定一個數組 rooms
,其中 rooms[i]
表示訪問房間 i 時可以獲得的鑰匙集合,如果你能訪問所有房間,返回 true,否則返回 false。
[Leetcode解題] 380. Insert Delete GetRandom O(1)
題目
380. Insert Delete GetRandom O(1)
實作一個 RandomizedSet
類別,這個類別需要支援以下操作:
RandomizedSet()
:初始化一個空的RandomizedSet
物件。bool insert(int val)
:如果val
不存在於集合中,插入val
並回傳true
;否則回傳false
。bool remove(int val)
:如果val
存在於集合中,移除val
並回傳true
;否則回傳false
。int getRandom()
:隨機回傳集合中的一個元素(保證至少有一個元素存在)。每個元素被選中的機率應該相同。
要求每個操作的平均時間複雜度為 $O(1)$。
[Leetcode解題] 1105. Filling Bookcase Shelves
題目描述
1105. Filling Bookcase Shelves
給定一個二維陣列 books
,其中 books[i] = [thicknessi, heighti]
表示第 i
本書的厚度和高度。還給定一個整數 shelfWidth
,表示書架每層的最大寬度。
我們要按照書的順序,依次把書放在書架上。每一層的書總厚度不能超過 shelfWidth,而這一層的高度就是放上去的書裡面最高的那本書的高度。我們需要重複這個過程直到所有書都放好,目標是讓書架的總高度最小。
[Leetcode解題] 3169. Count Days Without Meetings
題目
3169. Count Days Without Meetings
給你一個正整數 days,表示員工可以工作的總天數(從第 1 天開始)。你還得到一個大小為 n 的二維數組 meetings,其中 meetings[i] = [start_i, end_i] 表示第 i 次會議的開始和結束天數(包括起止天)。
返回員工可以工作但沒有安排會議的天數。
注意:會議可能會重疊。
[Leetcode解題] 1004. Max Consecutive Ones III
題目描述
1004. Max Consecutive Ones III 假設有一個由0和1組成的二進位陣列nums
,還有一個整數k
。你可以把陣列中的最多k
個0
翻轉成1
。請問這樣做之後,陣列中可以得到的連續1
的最大長度是多少?
[Leetcode解題] 959. Regions Cut By Slashes 以DFS解
題目
一個 n x n 的網格由 1 x 1 的方格組成,每個方格內包含 ‘/’, ‘\’ 或空格 ‘ ‘,這些字符將方格劃分為連續的區域。給定表示為字符串數組的網格 grid,返回區域的數量。
[Leetcode解題] 3143. Maximum Points Inside the Square
題目
3143. Maximum Points Inside the Square
給定一個二維陣列 points 和一個字符串 s,其中 points[i] 表示第 i 個點的坐標,s[i] 表示第 i 個點的標籤。
一個有效的正方形必須以原點 (0, 0) 為中心,邊與軸平行,且不能包含兩個標籤相同的點。
返回一個有效的正方形內最多可以包含的點數。
如果一個點位於正方形的邊界上或內部,則認為該點在正方形內。正方形的邊長可以為零。
[Leetcode解題] 133. Clone Graph - 使用 DFS 解
133. Clone Graph
題目描述
133. Clone Graph 給定一個連通無向圖中的一個節點的引用。請返回這個圖的深拷貝(克隆)。
每個節點包含一個整數值和一個鄰居列表(List[Node]
)。
節點的定義如下:
class Node:
def __init__(self, val=0, neighbors=[]):
self.val = val
self.neighbors = neighbors
[Leetcode解題] 1605. Find Valid Matrix Given Row and Column Sums - 使用Greedy+雙指針解
題目
1605. Find Valid Matrix Given Row and Column Sums
給定兩個非負整數數組rowSum
和colSum
。rowSum[i]
表示第 i 行所有元素的和,而 colSum[j]
表示第 j 列所有元素的和。求任意一個滿足rowSum
和colSum
要求的非負整數矩陣,其大小為 rowSum.length
x colSum.length
。
[Leetcode解題] 986. Interval List Intersections - 雙指針解
題目:求兩個區間列表的交集
986. Interval List Intersections
給定兩個封閉區間的列表 firstList
和 secondList
,其中 firstList[i] = [starti, endi]
和 secondList[j] = [startj, endj]
。這些區間都是兩兩不相交的,並且按排序順序排列。
返回這兩個區間列表的交集。
一個封閉區間 [a, b]
(其中 a <= b
)表示實數 x
的集合,使得 a <= x <= b
。
兩個封閉區間的交集是一組實數,要麼為空,要麼表示為一個封閉區間。例如,[1, 3]
和 [2, 4]
的交集是 [2, 3]
。
[Leetcode解題] 1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit - 使用deque+ two pointer解
題目
1438. Longest Continuous Subarray With Absolute Diff Less Than or Equal to Limit
給定一個整數數組 nums
和一個整數 limit
,請返回長度最大的非空子陣列的長度,使得該子陣列中任何兩個元素之間的絕對差不超過 limit
。
[Leetcode解題] 1248. Count Number of Nice Subarrays - 使用presum+hashtable解
題目
1248. Count Number of Nice Subarrays
給定一個整數矩陣nums
和一個整數k
。如果一個連續子陣列包含恰好k
個奇數元素,則稱其為漂亮子陣列nice sub-arrays
。求全部漂亮子陣列的數量。
[Leetcode解題] 1482. Minimum Number of Days to Make m Bouquets - binary-search解
題目
1482. Minimum Number of Days to Make m Bouquets
你有一個整數陣列 bloomDay
,以及兩個整數 m
和 k
。你希望製作 m
束花,每束花需要 k
朵相鄰的花。
花園裡有 n
朵花,第 i
朵花在 bloomDay[i]
這一天綻放,然後可以用來製作一束花。
我們需要找到能夠製作 m
束花的最少天數。如果無法製作出 m
束花,返回 -1。
輸入說明
bloomDay
: 整數陣列,代表每朵花綻放的日子。m
: 需要製作的花束數量。k
: 每束花需要的相鄰花朵數量。
輸出說明
返回能夠製作 m
束花的最少天數,如果無法製作出 m
束花,返回 -1。
[Leetcode解題] 979. Distribute Coins in Binary Tree
題目
979. Distribute Coins in Binary Tree
給一棵二元樹,上面每個點可能會有硬幣,但所有硬幣總和的數量跟節點的數量一樣,求最小要移動幾步才能讓每個點剛好有一個硬幣。
[Leetcode解題] 1423. Maximum Points You Can Obtain from Cards
題目
1423. Maximum Points You Can Obtain from Cards
有幾張卡片排成一列,每張卡片都有一個對應的點數。這些點數存放在 cardPoints
中。每一步,你可以從這列卡片的開頭或結尾拿走一張卡片,必須恰好拿走 k
張卡片。你的得分是你拿走的卡片點數的總和。
給定 cardPoints
和整數 k
,返回你可以獲得的最大得分。
[Leetcode解題] 2034. Stock Price Fluctuation
題目:
2034. Stock Price Fluctuation 你會拿到一堆股票價格的記錄,每個記錄包含一個時間戳記和對應的股價。不幸的是,這些記錄不是按照順序來的。更糟糕的是,有些記錄可能是錯誤的。之後可能會有一條相同時間戳記的記錄出現在流中,用來更正之前錯誤的記錄價格。
你需要設計一個算法:
- 更新特定時間的股票價格,從之前的任何記錄中更正該時間的價格。
- 基於當前記錄找到股票的最新價格。最新價格是記錄的最新時間的價格。
- 找到股票在當前記錄中的最高價格。
- 找到股票在當前記錄中的最低價格。
實現 StockPrice 類:
StockPrice()
: 初始化沒有價格記錄的對象。void update(int timestamp, int price)
: 更新給定時間戳的股票價格。int current()
: 返回股票的最新價格。int maximum()
: 返回股票的最高價格。int minimum()
: 返回股票的最低價格。
[Leetcode解題] 1146. Snapshot Array
題目
1146. Snapshot Array 你需要實作一個 SnapshotArray 資料結構,支援以下介面:
SnapshotArray(length)
: 初始化一個長度為指定長度的類似陣列結構。最初,每個元素都是0。set(index, val)
: 設置給定索引index
的元素為val
。snap()
: 拍攝陣列的快照並返回快照 ID
,即我們呼叫snap()
的總次數減去1。get(index, snap_id)
: 返回在給定快照 ID
時給定index
的值。
[Leetcode解題] 309. Best Time to Buy and Sell Stock with Cooldown
309. Best Time to Buy and Sell Stock with Cooldown
題目
309. Best Time to Buy and Sell Stock with Cooldown
想像你在買賣股票,給定一個股票價格的序列表示每天的股價,每次可以選擇買或是賣,如果賣出的時候,會有一天的cooldown不能買,每次只能持有一個股票。
[Leetcode解題] 368. Largest Divisible Subset - 使用dp 算法
題目
368. Largest Divisible Subset 給定一組不同的正整數 nums,返回最大的子集 answer,使得該子集中的每對元素 $(answer[i], answer[j])$ 都滿足以下條件: $answer[i] \% answer[j] == 0$,或者 $answer[j] \% answer[i] == 0$
如果有多個解,返回其中任意一個。
[Leetcode解題] 189. Rotate Array
題目
給一個矩陣nums
以及一個數字k
,將矩陣元素往右移動k
,舉例來說,如果給[1,2,3,4,5,6,7], k=3
,所有元素往右三格即得[5,6,7,1,2,3,4]
。
題目要求要在$O(1)$的空間複雜度下解。
[Leetcode解題] 200. Number of Islands - DFS解
題目
給定一個m x n的2D二進制網格grid,代表一張地圖,其中’1’代表陸地,’0’代表水域。請計算並返回地圖上的島嶼數量。
島嶼是由水域包圍並由相鄰的陸地水平或垂直連接形成的。請注意,網格的四個邊緣都被水域包圍。
[Leetcode解題] 146. LRU Cache
題目
146. LRU Cache 設計一個資料結構,符合最近最少使用 (LRU) cache的限制。實作 LRUCache 類別,包含以下方法:
- LRUCache(int capacity):初始化一個具有正數容量的 LRU cache。
- int get(int key):如果key存在,返回相對應的value,否則返回 -1。
- void put(int key, int value):如果key存在,更新相對應的value。否則,將key-value添加到cache中。如果使key的數量超過capacity,則淘汰最近最少使用的key。
get 和 put 方法的平均時間複雜度應為 O(1)。
[Leetcode解題] K Closest Points to Origin - Quick Select解
題目
973. K Closest Points to Origin
給定一個points
陣列,其中 $points[i] = [x_i, y_i]$ 代表 $XY$ 平面上的一個點,以及一個整數 k
,請返回距離原點 $(0, 0)$ 最近的前 $k$ 個點。
- 兩點之間的距離: 使用歐幾里得距離($\sqrt{(x1 - x2)^2 + (y1 - y2)^2}$)。
- 可以以任何順序返回答案,且答案保證是唯一的(除了順序不同)。
[Leetcode解題] Minimum Add to Make Parentheses Valid - stack解
題目
921. Minimum Add to Make Parentheses Valid
給定一個括號字串s
,一次操作可以在字串的任何位置插入一個括號。請計算使字符串有效的最小操作次數。
有效括號字串的定義如下:
- 它是空字串,
- 它可以寫成AB(A與B連接),其中A和B都是有效字符串,或者
- 它可以寫成(A),其中A是有效字符串。
[Leetcode解題] Simplify Path - stack解
題目
這是一個處理 Unix-style 文件系統中給定絕對路徑的問題。我們需要將給定的路徑轉換為簡化的規範路徑。在 Unix-style 文件系統中,.
代表當前目錄,..
代表上一級目錄,連續的多個斜線 /
被視為單一的斜線 /
。這個問題的目標是返回簡化的規範路徑,滿足一些特定的格式要求。
[Leetcode解題] 227. Basic Calculator II - stack解
題目:
給定一個字符串s,表示一個表達式,請求解這個表達式的值。
- 整數除法應該向零而不是向無限小截斷。
- 你可以假設給定的表達式始終是有效的。所有中間結果都將在範圍$[-2^{31}, 2^{31}-1]$內。
- 注意:不允許使用任何內置函數來評估字符串作為數學表達式,如eval()。
[Leetcode解題] 994. rotted oranges - BFS
題目
這題題目給定一個二維矩陣,矩陣中每個值代表一顆橘子的狀態,橘子的狀態可能有三種,可能為腐爛(2)
, 新鮮(1)
, 空(0)
,如果空代表該格沒有橘子。
每過一秒,腐爛的橘子會讓其上下左右的橘子也變腐爛,題目問過幾秒後,所有橘子都會腐爛,如果沒辦法使所有橘子腐爛,則回傳-1
[Leetcode解題] Kth Largest Element in an Array - 最小堆(Min Heap)& Quick Select 解
題目
215. Kth Largest Element in an Array
給定一個整數陣列 nums
和一個整數 k
,請找出陣列中第 k 大的元素。請注意,這裡指的是陣列按照升序排序後的第 k 大元素,而非第 k 個不同的元素。我們可以不使用sort解決這個問題嗎?
Example 1:
Input: nums = [3,2,1,5,6,4], k = 2
Output: 5
Example 2:
Input: nums = [3,2,3,1,2,4,5,5,6], k = 4
Output: 4
[Leetcode解題] 1319. Number of Operations to Make Network Connected - DisjointSet解法
題目
1319. Number of Operations to Make Network Connected 連接所有計算機的最少操作次數
給定$n$台計算機,編號從$0$到$n-1$,它們之間通過以太網電纜相互連接,形成一個網絡。給定初始的連接配置connections,其中connections[i] = [ai, bi]
表示計算機ai
和bi
之間有一條連接。任何一台計算機都可以通過網絡直接或間接地連接到任何其他計算機。
你可以提取某些已經連接的電纜,將它們連接到任意一對未連接的計算機上,使它們直接連接起來。
請計算出需要執行的最小操作次數,使得所有計算機都能連接在一起。如果無法實現,請返回$-1$。
[Leetcode解題] Satisfiability of Equality Equations - 使用DisjoinSet算法
題目
990. Satisfiability of Equality Equations
給定一個字串序列 $equations$,表示變量之間的關係。每個字串 equations[i]
的長度為4,有兩種不同的形式:"xi==yi"
或 "xi!=yi"
。其中,$x_i$ 和 $y_i$ 是小寫字母(可以相同),表示單個字母的變量名。
如果能夠對變量名分配整數,使得滿足所有給定的等式關係,則返回 $true$;否則返回 $false$。
[Leetcode解題] Detonate the Maximum Bombs - 使用圖算法
題目
2101. Detonate the Maximum Bombs 給定一個列表,列表中的每個元素有三個組成元素,$(x, y, r)$表示圓中心點的位置,以及其半徑$r$,每個點表示一顆炸彈,圓的面積表示炸彈可以炸的範圍,爆炸時會引爆其他炸彈,題目要求,若只能引爆一顆炸彈,最多可以引爆幾顆炸彈。
[Leetcode解題] Uncrossed Lines - DP + scrolling array解
題目
1035. Uncrossed Lines 給定兩個整數列表 $nums1$ 和 $nums2$,我們將列表 $nums1$ 和 $nums2$ 中的整數(按照給定順序)分別寫在兩條水平線上。
我們可以繪製連接線:一條直線連接兩個數字 nums1[i]
和 nums2[j]
,滿足以下條件:
[Leetcode解題] Course Schedule - 使用DFS解法
題目
這題我們給定一個序列,序列中的元素為課程編號以及其先修課程,舉例來說[$a_i$, $b_i$]代表我們必須先修過$b_i$才能選修$a_i$。另外會給定課程總數$numCourses$,課程的編號從$0$至$numCourses-1$,而題目要求我們是否能夠完成全部課程。
[Leetcode解題] Validate Binary Search Tree - 遞迴解
題目
98. Validate Binary Search Tree
這題我們要驗證給定的樹是否為一個合法的二元搜尋樹(Binary Search Tree),一個合法的BTS
需要符合以下幾點:
- 所有左子樹的節點都必須小於根節點(root)
- 所有右子樹的節點都必須大於根節點
- 左子樹跟右子樹也要是二元搜尋樹
[Leetcode解題] Best Team With No Conflicts - dp解
題目
1626. Best Team With No Conflicts 給定兩個列表scores和ages,其中scores[i]和ages[i]分別表示第i個球員的得分和年齡。球隊的得分是所有球員得分的總和。但球隊有一個限制:年齡較小的球員的得分不能嚴格高於年齡較大的球員。同齡球員之間不會存在衝突。請找出所有可能的籃球隊中的最高總分。
[Leetcode解題] Word Search - bfs/dfs解
題目
解題思路
這題我們很直接會想要用BFS/DFS的解法來解,以每個點為起點去做搜尋,這樣時間複雜度為$O(M N 3^L)$,$M, N$為棋盤的長寬,$L$為搜尋字串的長度,最差的情況來說,我們需要走訪$M \times N$個點作為起點,每個點又需要走過$L$個點做探索,每個位置可以往上下左右走,所以最壞有$4*3^{L-1}$種可能。
[Leetcode解題] Subsets - dfs解
題目
78. Subsets 這是一道關於「子集」的題目。給定一個整數數組 nums,其中所有元素均為唯一的,請返回所有可能的「子集」(即集合的幂集)。 解決方案集不得包含重複的子集。您可以以任意順序返回解決方案。
[Leetcode解題] Best Time to Buy and Sell Stock with Transaction Fee - greedy解
題目
714. Best Time to Buy and Sell Stock with Transaction Fee 給定一個數組prices,其中prices[i]表示第i天的股票價格,以及一個代表交易費用的整數fee。
找到您可以實現的最大利潤。您可以進行任意多次交易,但每次交易都需要支付交易費用。
注意:您不能同時進行多個交易(即,在買入股票之前必須先將其出售)。
[Leetcode解題] Merge Intervals - greedy解
題目
56. Merge Intervals
給定一個區間陣列intervals(List[List[int]])
,其中 intervals[i] = [start_i, end_i]
,合併所有重疊區間,並返回覆蓋輸入中所有區間的非重疊區間陣列。
[Leetcode解題] Bulls and Cows - 暴力解
題目
這是一個”Bulls and Cows”遊戲,你和你的朋友玩。你先寫下一個秘密數字,然後讓你的朋友猜數字。當你的朋友猜時,你會提供一個提示,內容包括:
猜對的數字數量,這些數字在猜測中的位置正確。
猜錯的數字數量,這些數字在秘密數字中,但位置不正確。特別的是,猜測中的非公牛數(B)字可以重新排列,以使它們成為公牛(A)。
給定秘密數字secret和朋友的猜測guess,返回朋友的猜測的提示。提示應格式化為”xAyB”,其中x是公牛的數量,y是牛的數量。
特別要注意的是,secret和guess都可能包含重複的數字。
[Leetcode解題] Flatten Binary Tree to Linked List - 遍歷二叉樹
題目
114. Flatten Binary Tree to Linked List
給一個二叉樹的root
,將樹壓平成一個linked list
。
這個linked list
應該與二叉樹的前序遍歷順序相同。
[Leetcode解題] Container With Most Water - 使用前後指針解
題目
11. Container With Most Water 給定一個長度為 $n$ 的整數數組 $height$,在平面直角坐標系上有 $n$ 條垂直線,其中第 $i$ 條線的兩端點分別為 $(i, 0)$ 和 $(i, height[i])$。 找到兩條線,與 $x$ 軸一起形成一個容器,使得該容器包含最多的水。 返回容器可以存儲的最大水量。