課程表 | Medium | LeetCode#207. Course Schedule
題目敘述 題目難度: Medium 題目描述:總共有 numCourses 課程需要上,他們被標注為 0 - numCourses-1,給定一個陣列 prerequisites 其中 prerequisites[i] = [a_i, b_i] 代表你需要先上過 b_i 課你才夠去上 a_i 課程。舉例來說,[0,1] 代表你需要先上課程 1 才能夠去上課程 0,如果可以完成所有課程就回傳 true 否則回傳 false。 解法一開始的想法一開始其實還沒有很懂題意,但在看了題目給的範例後才發現這題,其實是要在有向圖中找是否有 Cycle , 如果看範例二就可以發現他其實就是一個Cycle,並且也會邏輯上不順,先修課程0再修課程1 跟先修課程1再修課程0 這兩個沒辦法同時成立 我這裡一樣是透過 DFS 去做,但還沒處理過找Cycle 的題目,因此有看了下Hint,這裡會需要額外的陣列來去保存DFS的呼叫路徑,一旦發現有走訪到走過的路,那就是有Cycle 我的解法123456789101112131415161718192021222324252627282930313233...
KoKo 吃香蕉 | Medium | LeetCode#875. Koko Eating Bananas
題目敘述 題目難度: Medium 題目描述:Koko 愛吃香蕉,今天有 n 堆的香蕉,第 i 堆香蕉的數量會是 piles[i],香蕉由守衛看守,守衛目前不在,但他會在 h 小時候回來。Koko 每小時吃香蕉的速度會是 k,每一小時 Koko 會去挑選一堆香蕉吃,如果某堆香蕉的數量小於 k 則Koko 會將它們全吃掉,並且在那一小時中不會再去吃其他堆香蕉。雖然 Koko 吃的很慢,但是他還是希望在守衛回來前將所有的香蕉都吃完,為了達到這個目的,Koko 每小時吃香蕉的速度 k 最小會是多少? 解法一開始的想法一開始還在想要怎麼樣決定k,這裡可以透過 Binary Search 的方式去將不同堆的元素作為 k 去嘗試,嘗試的方式就是將每堆元素扣除 K 直到變成 0,同時記錄時數,只要最終時數小於 h 則回傳 k 值,只要最終時數大於 h 則繼續透過二元法找其他的 k 我的解法1234567891011121314151617181920212223242526272829class Solution {public: int minEatingSpeed(ve...
替換後的最長重複字元 | Medium | LeetCode#424. Longest Repeating Character Replacement
題目敘述 題目難度: Medium 題目描述: 給定一個字串 s 以及整數 k ,題目要求我們需要去將 s 中的任意字元替換成其他英文大寫字母,這樣的替換操作可以進行 k 次,在進行 k 次操做後,請回傳具有相同字母的最長的子字串 解法一開始的想法對於關鍵字,最長子字串,可以直接聯想到要使用 Sliding Window,但這題除了找到子字串之外,還需要透過 Hash Table 來去紀錄個別字母的出現頻率,同時在滑動窗口的同時需要紀錄最大長度。 我的解法1234567891011121314151617181920212223class Solution {public: int characterReplacement(string s, int k) { unordered_map<char, int> umap; int maxFreq = 0; int maxLength = 0; string tempStr = s; int left = 0; ...
太平洋-大西洋水流 | Medium | LeetCode#417. Pacific Atlantic Water Flow
題目敘述 題目難度: Medium 題目描述: 有個大小 m x n 的長方形島嶼,它的邊界被太平洋與大西洋包圍。與太平洋交界的會是島嶼的上方以及左側邊緣,與大西洋交界的會是島嶼的下方和右側邊緣。島嶼被切分成許多網格單元,可以視為一個 m x n 大小的矩陣 heights,其中 heights[r][c] 代表座標 (r,c) 位置的海拔高度。 島上很常下雨, 只要當前單元格的海拔高度大於或等於其上下左右單元格的海拔高度,則雨水可以自由流向他的上下左右單元格。 雨水可以透過相鄰單元格一路流到海洋中。 題目要求回傳一個 2D 矩陣 result, 其中 result[i] = [r_i, c_i] 代表雨水可以從座標 (r_i, c_i) 同時流到太平洋與大西洋。 解法一開始的想法一開始覺得這題一樣會是 connected components 只是 connected 的條件變成只要四周格子比當前格子小,就能 connected,但沒有好好想到要如何同時滿足流向大西洋以及太平洋,並且要怎麼挑選走訪時候的起始點。 後來看了提示後發現,可以 反向模擬水流流向,也就是個別從大...
LRU 快取 | Medium | LeetCode#146. LRU Cache
題目敘述 題目難度: Medium 題目描述: 題目要求設計一套結構能夠滿足 [LRU(Least Recently Used) Cache])(https://en.wikipedia.org/wiki/Cache_replacement_policies#LRU) 題目要求實踐 LRUCache class: LRUCache(capacity): 使用 capacity 初始化 LRUCache 大小 int get(int key): 如果 key 存在,則返回對應的值,若不存在則返回 -1 void put(int key, int value): 如果 key 存在,則更新它的值,否則添加 key-value pair 到 cache。若 key 的數量車超出 capacity 大小,則逐出最近最少使用的Key 解法一開始的想法這題因為很偏系統設計,所以剛接觸的時候反而沒太多想法,可以知道的是大多做法都是使用 doubly linked list 搭配 Hash Table 去進行實作 ,而為什麼要是這樣做,主要是因為這個結構在搜尋特定的 key 是否存...
包圍的區域 | Medium | LeetCode#130. Surrounded Regions
題目敘述 題目難度: Medium 題目描述: 給定一個 m x n 大小的 board,包含兩種字母 X 或者 O,目的是捕捉被包圍的區域: Connected: 一個格子可以與相鄰的格子(水平或垂直)相連Region: 通過連接每個 O 格子來形成一個區域(Region)Surround: 如果一個區域的所有 O 格子都能被 X 格子連接,並且該區域中的 O 格子不在矩陣的邊緣上,則該區域被視為被包圍 題目要捕捉被包圍的區域, 將原始矩陣中所有被包圍的 O 替換為 X。 此操作應直接在原始矩陣上進行,無需返回任何值。 解法一開始的想法這題我一開始的想法有點偏掉,但這題的意思就是: 找出被包圍 Region 並將 Region 中的 O 換成 X 如果 Region 有接到矩陣邊緣,則不替換成 X 這樣依舊會需要先透過 DFS 或者是 BFS 來先去走訪 connected components (相連的 O) 這裡可以透過 先從邊緣查找是否有 O,如果有作爲起點進行 DFS, 找到的Connected components 這都代表是不能轉換成 X 的區域 ...
有效的數獨 | Medium | LeetCode#36. Valid Sudoku
題目敘述 題目難度: Medium 題目描述: 給定一個 9 x 9 大小的數獨 board 請確認該數獨是否是有效的。 只有當被填入數字滿足下面條件,數獨才會是有效的:(1) 每一列只包含非重複的數字 1-9(2) 每一行只包含非重複的數字 1-9(3) 共9個 3 x 3 的子方格, 每個子方格中的數字 1-9 都不重複 解法一開始的想法想法就偏向暴力解,首先就是要迭代 board 中每一列,看數字是否重複,這時可以用一個 unordered_set 去儲存數字,並在每一格檢查數字是否重複,如果重複就回傳 false,接著迭代每一行檢查是否重複。每次換行換列 unordered_set 都要清空為的是保存新的一行/列的數字。 最後就是需要迭代 9 個 3*3 大小的子方格,如果重複就回傳 false 函數最後代表檢查完畢,回傳 true。 我的解法1234567891011121314151617181920212223242526272829303132333435363738394041424344454647class Solution {...
腐爛中的橘子 | Medium | LeetCode#994. Rotting Oranges
題目敘述 題目難度: Medium 題目描述: 給定一個 m x n 大小的矩陣叫做 grid ,其中每一格可能會這三種值其中一種: (1) 0 代表那格是空的 (2) 1 代表新鮮橘子 (2) 2 代表腐爛橘子。每分鐘在腐爛橘子四周的(上下左右)其他新鮮橘子都會腐爛,請回傳整個 grid 中所有新鮮橘子都腐爛最少需要幾分鐘,如果不可能全都腐爛,則回傳 -1 解法一開始的想法我原先認為這題就是要將腐爛橘子作為搜尋起點,然後BFS走訪附近的新鮮橘子,並且計算距離,每多走一格就會變成腐爛橘子,最後回傳最小距離就好。但後來發現這樣不符合題意,因為題目的要求是每一分鐘腐爛過子四周的新鮮橘子也會變腐爛,原先的做法會忽略了 「一輪 BFS 表示一分鐘」的關鍵邏輯。 腐蝕的時間應該是按 層數來計算,而非單純依照單一節點的距離。並且在BFS結束後,可能還是會有新鮮橘子存在(可能是分隔在其他cell中), 所以為了判斷最後是否還有新鮮橘子存在,需要一個變數再一開始就紀錄有多少新鮮橘子,並且在BFS走訪過程,每經過一層,就會將路過的新鮮橘子數量扣除。這樣最後就能判斷是否還有剩新鮮橘子 我的解法1...
牆壁與閘門 | Medium | LeetCode#286. Walls and Gates
題目敘述 題目難度:Medium 題目描述: 給定一個 m x n 大小的網格 rooms 並且可能初始化三種值:(1) -1 代表牆壁或者障礙物 (2) 0 代表閘門 (3) INF 則代表空房間,這裏的 INF 代表 2^31 - 1 = 2147483647 (整數的上界),其實就想成是房間到閘門的距離初始化無限大。 本提要求將空房間填入距離他最近閘門的距離值。 解法一開始的想法這裡其實也是要求從圖中的閘門當成搜尋起點,來去進行路徑走訪,將所有路過的空房間都標注與閘門的距離,所以要做的事會是 BFS 走訪。只不過在 BFS 發現新的 Connected Vertex 的時候會需要將其標注上與搜尋起點(閘門)的距離 我的解法123456789101112131415161718192021222324252627282930313233343536class Solution {public: void wallsAndGates(vector<vector<int>>& rooms){ int m=...
複製圖 | Medium | LeetCode#133. Clone Graph
題目敘述 題目難度:Medium 題目描述: 題目給定了一個 connected undirect graph 中節點的參考設計,希望你回傳這個 graph 的 Deep Copy 1234class Node { public int val; public List<Node> neighbors;} 其實看到 Deep Copy 就可以想的是要用 Hash Table 了 這題還有說明,這題節點的 index 與節點的 value 相同,也就是第一個節點的 val 就會是 1 ,而第二個節點的 val 就會是 2 以此類推。 然後題目會給定一個 adjacency list 這個 list 中的每個 sublist 都描述了個別節點與其他節點的相鄰狀況,例如: 1adjList = [[2,4],[1,3],[2,4],[1,3]] 這代表第ㄧ個節點 (index=0) 的鄰接節點有 val==2 以及 val==4 的節點。 而這代表第二個節點 (index=1) 的鄰接節點有 val==1 以及 val==3 的節...













