1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | class Solution { public: vector<int> findMinHeightTrees(int N, vector<vector<int>> &edges) { if (N == 1) return vector<int>({0}); queue<int> Q; vector<vector<int>> G(N); vector<int> inDegree(N); for (auto &edge : edges) { int u = edge[0]; int v = edge[1]; G[u].push_back(v); G[v].push_back(u); inDegree[u]++; inDegree[v]++; } for (int i = 0; i < N; i++) if (inDegree[i] == 1) Q.push(i); int size = N; while (size > 2) { int leafSize = Q.size(); size -= leafSize; for (int i = 0; i < leafSize; i++) { int cur = Q.front(); Q.pop(); for (int adj : G[cur]) { inDegree[adj]--; if (inDegree[adj] == 1) Q.push(adj); } } } vector<int> ans; while (!Q.empty()) { ans.push_back(Q.front()); Q.pop(); } return ans; } }; |
2026/05/26
[LeetCode] 310 Minimum Height Trees
2026/05/25
[LeetCode] 438 Find All Anagrams in a String
用 "==" 直接比較兩個std::unordered_map是否相同
要小心有插入過但又歸零的key
跟從沒插入過是不等價的
所以要檢查是否有在pattern字串裡
才能插入std::unordered_map
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | class Solution { public: vector<int> findAnagrams(string s, string p) { if (p.size() > s.size()) return vector<int>(); unordered_map<char, int> patMap; unordered_map<char, int> curMap; vector<int> ans; for (int i = 0; i < p.size(); i++) patMap[p[i]]++; for (int i = 0; i < p.size(); i++) if (patMap.count(s[i])) curMap[s[i]]++; if (patMap == curMap) ans.push_back(0); for (int left = 0, right = p.size(); right < s.size(); left++, right++) { if (patMap.count(s[left])) curMap[s[left]]--; if (patMap.count(s[right])) curMap[s[right]]++; if (curMap == patMap) ans.push_back(left + 1); } return ans; } }; |
2026/05/24
[LeetCode] 973 K Closest Points to Origin
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public: vector<vector<int>> kClosest(vector<vector<int>>& points, int k) { vector<pair<int, int>> v; for (int i = 0; i < points.size(); i++) { int dis = points[i][0] * points[i][0] + points[i][1] * points[i][1]; v.push_back(make_pair(dis, i)); } sort(v.begin(), v.end()); vector<vector<int>> ans; for (int i = 0; i < k; i++) ans.push_back(points[v[i].second]); return ans; } }; |
2026/05/22
[LeetCode] 542 01 Matrix
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | class Status { public: int x, y, dis; Status(int _x, int _y, int _dis) : x(_x), y(_y), dis(_dis) {} }; class Solution { private: int N, M; vector<vector<int>> dis; int dirX[4] = {0, 1, 0, -1}; int dirY[4] = {1, 0, -1, 0}; public: vector<vector<int>> updateMatrix(vector<vector<int>> &mat) { queue<Status> Q; N = mat.size(); M = mat[0].size(); dis.resize(N); for (int i = 0; i < N; i++) { dis[i].resize(M); for (int j = 0; j < M; j++) { if (mat[i][j] == 0) { Q.push(Status(i, j, 0)); dis[i][j] = 0; } else dis[i][j] = INT_MAX; } } while (!Q.empty()) { Status cur = Q.front(); Q.pop(); for (int i = 0; i < 4; i++) { int dx = cur.x + dirX[i]; int dy = cur.y + dirY[i]; if (dx < 0 || dx >= N || dy < 0 || dy >= M) continue; if (dis[dx][dy] <= cur.dis + 1) continue; dis[dx][dy] = cur.dis + 1; Q.push(Status(dx, dy, cur.dis + 1)); } } return dis; } }; |
2026/05/21
[LeetCode] 199 Binary Tree Right Side View
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), * right(right) {} * }; */ class Solution { private: std::vector<int> ans; void dfs(TreeNode *node, int depth) { if (!node) return; if (ans.size() < depth) ans.push_back(node->val); dfs(node->right, depth + 1); dfs(node->left, depth + 1); } public: std::vector<int> rightSideView(TreeNode *root) { dfs(root, 1); return ans; } }; |
2026/05/20
[LeetCode] 416 Partition Equal Subset Sum
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | class Solution { public: bool canPartition(vector<int> &nums) { int sum = std::accumulate(nums.begin(), nums.end(), 0); if ((sum & 1) == 1) return false; sum >>= 1; std::vector<bool> dp(sum + 1, false); dp[0] = true; for (int num : nums) for (int i = sum; i >= num; i--) dp[i] = dp[i] || dp[i - num]; return dp[sum]; } }; |
2026/05/19
[LeetCode] 150 Evaluate Reverse Polish Notation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | class Solution { private: bool isOperator(string token) { return token == "+" || token == "-" || token == "*" || token == "/"; } int performOp(string op, int x, int y) { if (op == "+") return x + y; if (op == "-") return x - y; if (op == "*") return x * y; if (op == "/") return x / y; std::unreachable(); } public: int evalRPN(vector<string> &tokens) { std::stack<int> stack; for (string token : tokens) { if (isOperator(token)) { int opnd2 = stack.top(); stack.pop(); int opnd1 = stack.top(); stack.pop(); stack.push(performOp(token, opnd1, opnd2)); } else stack.push(std::stoi(token)); } int result = stack.top(); return result; } }; |
2026/05/18
[LeetCode] 236 Lowest Common Ancestor of a Binary Tree
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { private: TreeNode *LCABT(TreeNode *cur, TreeNode *p, TreeNode *q) { if (!cur || cur == p || cur == q) return cur; TreeNode *left = LCABT(cur->left, p, q); TreeNode *right = LCABT(cur->right, p, q); if (left && right) return cur; if (left) return left; return right; } public: TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) { return LCABT(root, p, q); } }; |
2026/05/17
[LeetCode] 78 Subsets
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | class Solution { private: int N; std::vector<vector<int>> ans; std::vector<int> cur; void dfs(int idx, vector<int>& nums) { if (idx == N) { ans.push_back(cur); return; } cur.push_back(nums[idx]); dfs(idx + 1, nums); cur.pop_back(); dfs(idx + 1, nums); } public: vector<vector<int>> subsets(vector<int>& nums) { N = nums.size(); cur.clear(); dfs(0, nums); return ans; } }; |
[LeetCode] 17 Letter Combinations of a Phone Number
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | class Solution { private: int N; std::vector<int> digit, cur; std::vector<std::string> ans; std::unordered_map<int, std::string> phoneMap = { {2, "abc"}, {3, "def"}, {4, "ghi"}, {5, "jkl"}, {6, "mno"}, {7, "pqrs"}, {8, "tuv"}, {9, "wxyz"}}; string makeResult() { string result; for (int i = 0; i < N; i++) result += phoneMap[digit[i]][cur[i]]; return result; } void dfs(int idx) { if (idx == N) { ans.push_back(makeResult()); return; } for (int i = 0; i < phoneMap[digit[idx]].size(); i++) { cur[idx] = i; dfs(idx + 1); } } public: vector<string> letterCombinations(string digits) { for (char c : digits) digit.push_back(c - '0'); N = digit.size(); cur.assign(N, 0); ans.clear(); dfs(0); return ans; } }; |
2026/05/16
[LeetCode] 733 Flood Fill
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | class Solution { private: int N, M; int dirX[4] = {0, 1, 0, -1}; int dirY[4] = {1, 0, -1, 0}; void dfs(int x, int y, int color, vector<vector<int>> &image) { int originalColor = image[x][y]; if (originalColor == color) return; image[x][y] = color; for (int i = 0; i < 4; i++) { int dx = x + dirX[i]; int dy = y + dirY[i]; if (dx >= 0 && dx < N && dy >= 0 && dy < M && image[dx][dy] == originalColor) dfs(dx, dy, color, image); } } public: vector<vector<int>> floodFill(vector<vector<int>> &image, int x, int y, int color) { N = image.size(); M = image[0].size(); dfs(x, y, color, image); return image; } }; |
[LeetCode] 704 Binary Search
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | class Solution { public: int search(vector<int>& nums, int target) { int left = 0; int right = nums.size() - 1; while (left <= right) { int mid = left + (right - left) / 2; if (nums[mid] == target) return mid; else if (nums[mid] < target) left = mid + 1; else right = mid - 1; } return -1; } }; |
2026/05/15
[LeetCode] 994 Rotting Oranges
BFS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | class State { public: int x, y, depth; }; class Solution { private: int dirX[4] = {0, 1, 0, -1}; int dirY[4] = {1, 0, -1, 0}; public: int orangesRotting(vector<vector<int>> &grid) { int N = grid.size(); int M = grid[0].size(); std::queue<State> Q; int fresh = 0; for (int i = 0; i < N; i++) for (int j = 0; j < M; j++) if (grid[i][j] == 1) fresh++; else if (grid[i][j] == 2) Q.push(State(i, j, 0)); int maxDepth = 0; int rotten = 0; while (!Q.empty()) { State cur = Q.front(); Q.pop(); maxDepth = std::max(maxDepth, cur.depth); for (int i = 0; i < 4; i++) { int dx = cur.x + dirX[i]; int dy = cur.y + dirY[i]; if (dx >= 0 && dx < N && dy >= 0 && dy < M && grid[dx][dy] == 1) { grid[dx][dy] = 2; rotten++; Q.push(State(dx, dy, cur.depth + 1)); } } } if (rotten == fresh) return maxDepth; return -1; } }; |
[LeetCode] 876 Middle of the Linked List
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 | /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nullptr) {} * ListNode(int x) : val(x), next(nullptr) {} * ListNode(int x, ListNode *next) : val(x), next(next) {} * }; */ class Solution { private: ListNode *takeOneStep(ListNode *node) { if (node) return node->next; return nullptr; } ListNode *takeTwoStep(ListNode *node) { return takeOneStep(takeOneStep(node)); } public: ListNode *middleNode(ListNode *head) { ListNode *slow = head; ListNode *fast = head; while (fast && fast->next) { slow = takeOneStep(slow); fast = takeTwoStep(fast); } return slow; } }; |
2026/05/14
[LeetCode] 75 Sort Colors
這演算法也太可愛
居然還有名字Dutch National Flag Algorithm!!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | class Solution { public: void sortColors(vector<int> &nums) { int low = 0; int mid = 0; int high = nums.size() - 1; while (mid <= high) { if (nums[mid] == 0) { std::swap(nums[low], nums[mid]); low++; mid++; } else if (nums[mid] == 1) mid++; else { std::swap(nums[mid], nums[high]); high--; } } } }; |
[LeetCode] 543 Diameter of Binary Tree
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {} * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), * right(right) {} * }; */ class Solution { private: int ans; int dfs(TreeNode *node) { if (!node) return 0; int left = dfs(node->left); int right = dfs(node->right); ans = std::max(ans, left + right); return std::max(left, right) + 1; } public: int diameterOfBinaryTree(TreeNode *root) { ans = 0; dfs(root); return ans; } }; |
2026/05/13
[LeetCode] 8 String to Integer (atoi)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | class Solution { private: string trimLeadingSpace(string s) { int i = 0; while (i < s.size() && s[i] == ' ') i++; return s.substr(i); } string trimSignedness(string s, int &sign) { int i = 0; sign = 1; if (s[i] == '-') { sign = -1; i++; } else if (s[i] == '+') i++; return s.substr(i); } int convert2Int(string s, int sign) { int i = 0; long long int result = 0; while (i < s.size() && std::isdigit(s[i])) { result = result * 10 + (s[i] - '0'); if (sign * result > INT_MAX) return INT_MAX; if (sign * result < INT_MIN) return INT_MIN; i++; } return static_cast<int>(sign * result); } public: int myAtoi(string s) { s = trimLeadingSpace(s); int sign = 1; s = trimSignedness(s, sign); int ret = convert2Int(s, sign); return ret; } }; |
訂閱:
文章 (Atom)