LeetCode 刷題知識總整理
前言這篇用來記錄刷leetcode 的各類主題,以及不同情境下要用的對應解題策略是哪些,也連接到之前所做的筆記跟部落格
Roadmap
這邊是參考 NeetCode 官網的roadmap 按照不同主題進行刷題的
Big-O
https://www.bigocheatsheet.com/
Two PointersTwo pointer 如果出現在陣列題目中,代表兩個索引(index),如果出現在 Linked List題目中,代表兩個不同的指標。但核心目的都是一樣的,透過移動pointer位置來減少溶於計算提高效率。
常見的Two pointer類型:
反向指針: 一個指向頭部一個指向尾部,逐漸向中間靠攏,檢查回文, 兩數之和通常很常用這種類型
快慢指針: 一個指針較快,另一個指針較慢,可以用於檢測Linked List 中是否有環。
某些情況下會搭配 Sliding Windo ...
DevOps技能樹知識整理 |【筆記目錄】
前言這裡紀錄 DevOps 面試常見的知識點,主要是參考了這個 github repository: DevOps Exercises 和 ByteByteGo 的 GitHub Repo 所做的筆記整理
可能會花很久時間才能夠全部整理完成~
DevOps GeneralPython
Basic Data Types
OOP / Class
Raise Exceptions
Regex
Async
File Manipulation
OS
lambda
decorator
Flask
文章: Python for DevOps |【DevOps技能樹】
Networking
TCP/UDP
OSI Model
CIDR
Mac Addr.
CSMA/CD
NAT
DNS
ICMP
TLS/SSL Handshake
Route Table
...
Git for DevOps 筆記 |【DevOps技能樹】
Basic
Q:你要如何確認一個目錄是一個 git repository?
檢查是否有 .git 文件
Q:請解釋什麼是 git directory, working directory, staging area
Git目錄:適用於儲存項目歷史紀錄的地方。包含所有 commit history, branch, label 等資料,存放於專案目錄中的 .git 資料夾內。
Git 目錄其實就是負責管理版本的主要資料存放地,可以透過 git log 命令查看資訊
工作目錄目前正在操作的專案目錄。在工作目錄中,git 會去提取 Git 目錄中的某個特定版本(正常會是最新版本),並將檔案提取出來,讓使用者可以直接編輯跟修改。
使用者對於工作目錄的變更並不會自動被 git 偵測,需要手動進行 add 以及 commit 進行更新。
Staging Area(暫存區)是一個臨時空間,可以讓你 ...
冗餘的連線 | Medium | LeetCode#684. Redundant Connection
題目敘述
題目難度: medium
題目敘述: 在這個問題中,Tree是一個無向圖,它是Connected的且沒有環。給定一個圖,它最初是一棵包含 n 個節點(標記為 1 到 n)的樹,但後來新增了一條額外的邊。這條新增的邊連接了從 1 到 n 中選擇的兩個不同的節點,且這條邊之前並不存在於樹中。這個圖由一個長度為 n 的陣列 edges 表示,其中 edges[i] = [a_i, b_i] 表示在圖中節點 a_i 和 b_i 之間存在一條邊。題目要求 返回一條可以被移除的邊,使得剩下的圖仍然是一棵包含 n 個節點的樹。 如果有多個答案,請返回輸入中 最後出現的那條邊。
解法一開始的想法一開始的想法想說,只要按照原先找 Connected Components 的思路,在 Adjacency List 找鄰居的時候,如果找回到已經造訪過的點,那就會是有迴圈,則該edge 是可被移除的 ...
無向圖中連通元件的數量 | Medium | LeetCode#323. Number of Connected Components in an Undirected Graph
題目敘述
題目難度:Medium
題目描述: 給定一張圖中有 n 個節點,以及一個陣列 edges 其中 edges[i] = [a_i, b_i] 代表從節點A到節點B存在 Edge,本題要求回傳這個圖紹 Connected Components 的數量。
解法一開始的想法由於題目給得是 edge 的陣列,可以由此陣列去建構出一個 n x n 的鄰接矩陣,如果矩陣中有值就為 true 開始針對已經有 true 的節點進行 DFS 然後每次返回到 Caller 時就讓某變數 sum 增加一,最後再回傳 sum 即可,就代表 Connected Components 的數量。
但 n x n 的鄰接矩陣,如果想要去選取出發點,勢必須要透過雙重迴圈來尋找,只要 n 夠大就會 Time Limit Excced,因此改良做法是改成鄰接串列(Adjacency List)
我的解法1234 ...
找出重複數字| Medium | LeetCode#287. Find the Duplicate Number
題目敘述
題目難度: medium
題目敘述: 題目給定一個整數陣列 nums 包含了 n+1 個數字,每個數字範圍為 [1,n] ,在 nums 只會有一種數字重複,請回傳是哪個數字重複。
這題要求只能使用常數空間,並且不能夠修改 nums 本身
解法一開始的想法這題規定只能使用常數空間,就代表要用時間換空間,基本上陣列或是 unordered_set 這種額外樣保存 n筆陣列資料的方式都不能用了,另外如果直接使用雙重回圈暴力解應該也會 TLE,因此這裡需要別的做法
解法1234567891011121314151617181920212223242526class Solution {public: int findDuplicate(vector<int>& nums) { int left = 1; ...
刷題知識整理 | 圖(Graph)-3
前言要能夠確保像是有先修微積分,才能修工程數學,這種 有前後關係的圖論問題,通常會用 拓樸排序(Topological Sort)
利用 DFS 尋找 Strong Connected Components(SCC)Strong Connected Components (SCC)
Vertex 之間有雙向的 Edge 相連,例如 從 vertex(A) 走到 vertex(B) 同時 vertex(B) 也要有 edge 連到 vertex(A),就會說這兩個vertex 是 strongly connected 的。
通常可以透過多次的 DFS 來確定 Directed Graph 中有哪些 Strongly Connected Components , 要進行多次DFS的原因在於,只有一次DFS 可能沒辦法識別出全部的 COnnected Components,根據搜尋起點的不 ...
用圖判斷有效的樹 | Medium | LeetCode#261. Graph Valid Tree
題目敘述
題目難度: Medium
題目描述:
You have a graph of n nodes labeled from 0 to n - 1. You are given an integer n and a list of edges where edges[i] = [ai, bi] indicates that there is an undirected edge between nodes ai and bi in the graph.Return true if the edges of the given graph make up a valid tree, and false otherwise.
解法一開始的想法這題會是一個無向圖要判斷有沒有 Cycle,由於是無向圖判斷Cycle,因此可以透過 DFS來去看能不能形成一個 DFS Tree,如果不行那 ...
課程表 | Medium | LeetCode#210. Course Schedule II
題目敘述
題目難度: Medium
題目描述: 總共有 numCourses 課程需要上,他們被標注為 0 - numCourses-1,給定一個陣列 prerequisites 其中 prerequisites[i] = [a_i, b_i] 代表你需要先上過 b_i 課你才夠去上 a_i 課程。舉例來說,[0,1] 代表你需要先上課程 1 才能夠去上課程 0,請以陣列形式回傳上完所有課程的休課順序,如果沒辦法完成請回傳空陣列。
這題基本上是接續 LeetCode-207 Course Schedule,只不過上一題是判斷能否修完課,這題是要把修課順序印出來
解法一開始的想法不能修完課的狀況就是同時存在 [0,1], [1,0] 因為順序就反了,會在Graph中構成 Cycle, 因此如果這是有向無環圖(DAG) 則可透過 topological sort 印出依序走訪完全部課程 ...
在 BST 中進行搜尋 | Easy | LeetCode#700. Search in a Binary Search Tree
題目敘述
題目難度: Easy
題目描述: 題目給定一個Binary Search Tree,每個樹節點都有值 val,請在BST找到以該 val 作為值的節點,如果沒找到就回傳 null
解法BST 的特性就是左邊節點 < 右邊節點,因此只要跟每個節點比較輸入的 val ,如果 val 大於當前節點就去查找其右子樹的 root,如果小於就給左子樹的root,就這樣遞迴查找,如果碰到 Leaf 後還是沒有找到就回傳 nullptr
但注意某些題目的定義會是 <=
我的解法12345678910111213141516171819202122232425262728/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left ...