刷題知識整理 | 圖(Graph)
前言以前我們在儲存資料的時候,常見的資料結構有陣列、雜湊表、鏈結串列等。想像你今天你剛上大學然後有個修課表,用表格列出各種課程,但你並不知道哪些課程需要先修,哪些可能需要之後再修,或者某些課程可能會擋修,這時候用圖來表示課程之間的關係就很方便了。所以圖的重點之一 就是保存資料與資料之間的關係 。
這篇部落格主要參考 這篇 的講解
圖(Graph)的定義延續上面的課程圖,每個課程都代表一個 節點,節點是可用於存放資料,資料就是課程名稱。而課程與課程之間有箭頭相連,代表課程與課程之間的關係。
vertex: 每個節點在圖中被稱為vertex,或 node,並定義所有 vertex 的集合叫做 $V$ 或是 $V(G)$edge: 每個線段稱為 edge, 在圖中通常會用一對vertex 來表示他們之間的edge ,$(V_{i}, V_{j})$ 就代表 $V_{i}$ 與 $V_{j ...
裝最多水的容器 | Medium | LeetCode#11. Container With Most Water
題目敘述
題目難度: Medium
題目敘述: 題目給了一個整數陣列 height 並且長度為 n, n 代表有 n 條垂直的線,第 i 條線的長度範圍為座標 (i,0) 到 (i, height[i]) (反正 height 的值就會是線的長度),請找到兩條線與X軸共同形成一個容器,可以裝最多的水,請回傳可能裝的最大面積。
解法一開始的想法總之面積會是由比較矮的直線乘上底邊 $Area = \min(height[i], height[j]) \times (j-i)$
暴力解12345678910111213141516class Solution {public: int maxArea(vector<int>& height){ int maxArea = 0; int n = height.s ...
反轉鏈結串列 II | Medium | LeetCode#92. Reverse Linked List II
題目敘述
題目難度:Medium
題目描述:給定一個鏈結串列的 head 以及整數 left 和 right,其中 left<= right,請將 left 到 right 範圍內的鏈結進行反轉,最後回傳整個串列的頭。
解法一開始的想法一開始的想法蠻單純的,就是要找到 left 的前一個節點,以及 right 的後一個節點 (用來記錄反轉後要連接的節點),將中間鏈結反轉後再接回這兩個節點。
我的解法1234567891011121314151617181920212223242526272829303132333435363738394041/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : ...
分隔鏈結串列 | Medium | LeetCode#86. Partition List
題目敘述
題目難度:Medium
題目描述: 給定一個Linked List 的 head 以及一個整數 x, 將整個 Linked List 以 x 來分隔,使節點值比 x 小的節點排在 x 前面,而節點值大於等於 x 的節點則排在 x 節點後面。
解法一開始的想法使用兩個陣列來分別儲存 1. 位置在 x 節點前面,但節點值比 x 還大的節點 和 2. 位置在 x 節點後面,但節點值比 x 還小的節點 這兩個種類的節點需要他過額外的陣列儲存,以利後續串列的重新建構。
但如過再讀取陣列值進行建構,還需要找到需要插入的位置,這樣複雜度會提高,因此不如分別建立兩個 list 的 head,然後迭代尋找並分別串列所有小於 x 的節點以及所有大於等於 x 的節點。
我的解法1234567891011121314151617181920212223242526class Solution ...
買賣股票的最佳時機IV | Hard | LeetCode#188. Best Time to Buy and Sell Stock IV
前言這題是股票買賣系列的題目:
121. Best Time to Buy and Sell Stock122. Best Time to Buy and Sell Stock II123. Best Time to Buy and Sell Stock III309. Best Time to Buy and Sell Stock with Cooldown
題目敘述
題目難度:Hard
題目描述: 給定一個整數陣列 prices,prices[i] 代表第 i 天的股票價格,每一天可以選擇買或賣股票,給定整數 k 代表可以進行的交易次數上限,請找出最大收益。
解法一開始的想法
這題基本上是完全延續 LeetCode#123. Best Time to Buy and Sell Stock III 的題目描述,因此我直接按照這題的經驗來去實踐
我的解法123456789101112 ...
買賣股票的最佳時機III | Hard | LeetCode#123. Best Time to Buy and Sell Stock III
前言這題是股票買賣系列的題目:
121. Best Time to Buy and Sell Stock122. Best Time to Buy and Sell Stock II188. Best Time to Buy and Sell Stock IV309. Best Time to Buy and Sell Stock with Cooldown
題目敘述
題目難度:Hard
題目描述: 給定一個整數陣列 prices,prices[i] 代表第 i 天的股票價格,每一天可以選擇買或賣股票,最多只能交易兩次 (買賣兩次),請找出最大收益。
與先前幾題的原則一樣,只能先買後賣,並且不允許同時有多筆交易,手上股票要賣出才能夠繼續買
解法一開始的想法一開始的想法蠻簡單的,就是與前面幾題一樣,假設 prices=[3,4,5,0,0,3,1,4] 那漲跌幅值如下
1+1 +1 ...
買賣股票的最佳時機II | Medium | LeetCode#122. Best Time to Buy and Sell Stock II
前言這題是股票買賣系列的題目:
121. Best Time to Buy and Sell Stock123. Best Time to Buy and Sell Stock III309. Best Time to Buy and Sell Stock with Cooldown
題目敘述
題目難度: Medium
題目描述: 給定一個整數陣列 prices,prices[i] 代表第 i 天的股票價格,每一天可以選擇買或賣股票,允許當日買在當日立刻賣出,然而任意時間段最多僅能持有一份股票
解法一開始的想法這題跟 LeetCode-121 Best Time to Buy and Sell Stock 不太一樣的是,這題允許多次交易,所以要求的是, 多筆買賣的總收益要最大化。
假設今天 prices = {7, 1, 5, 3, 6, 4} 則在股價為 1 時買 ...
買賣股票的最佳時機 | Easy | LeetCode#121. Best Time to Buy and Sell Stock
前言這題是股票買賣系列的題目,與他類似的題目會是
122. Best Time to Buy and Sell Stock II123. Best Time to Buy and Sell Stock III188. Best Time to Buy and Sell Stock IV309. Best Time to Buy and Sell Stock with Cooldown
題目敘述
題目難度: Easy
題目描述: 給定一個陣列 prices,prices[i] 代表在第 i 天的股票價格。請選一天進買入股票,但在不同天賣出股票 (買賣股票不能在同一天,且須先買股票才能賣股票),求股票的最大化收益。
解法一開始的想法一開始的想法複雜度其實比較高,就是透過一個迴圈來決定買入,透過另一個內部迴圈決定賣出,然後透過一個變數 maxValue 保存第 i 天買入然後第 j 天賣出 ...
最大正方形 | Medium | LeetCode#221. Maximal Square
題目敘述
題目難度: Medium
題目敘述: 給定一個 m x n 大小的二元陣列 matrix (由 0, 1 填充而成),請找出僅包含 1 的最大正方形面積。
解法一開始的想法這個問題要找出 僅包含 1 的最大正方形面積 ,可以拆分成兩個問題,第一個就是 如何找出正方形面積? 第二個就是 如何比較出最大的面積? 我最初的想法還是偏向暴力解,如果將矩陣的右下角定為起點,那正方形就會是任意點 (i, j) 往上以及往左圍出的區域
我的解法 - 暴力解1234567891011121314151617181920212223242526272829303132class Solution {public: int maximalSquare(vector<vector<char>>& matrix){ if(ma ...
從排序串鏈移除重複節點 II | Medium | LeetCode#82. Remove Duplicates from Sorted List II
題目敘述
題目難度: Medium
題目描述:給定一個排序鏈結的 head,刪除所有具有重複數字的節點,使原有鏈結最後只剩下相異的數值的節點,並回傳該list的 head
解法一開始的想法由於要檢查是否有數值重複,因此這部分會想到要用 Hash Table 來實現,並且移除重複節點,還需要一個dummy head 搭新的指標來去指向前一個節點。
我的做法123456789101112131415161718192021222324252627282930313233343536373839/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {& ...