From ecef2db41cd73860ef42e94fd30b22f8d32bcde5 Mon Sep 17 00:00:00 2001 From: Ju Hwijung Date: Sun, 10 May 2026 19:10:47 +0900 Subject: [PATCH] =?UTF-8?q?10=EC=A3=BC=EC=B0=A8=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=92=80=EC=9D=B4=205=EA=B0=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- course-schedule/hwi-middle.cpp | 64 +++++++++++++++++++ invert-binary-tree/hwi-middle.cpp | 26 ++++++++ jump-game/hwi-middle.cpp | 18 ++++++ merge-k-sorted-lists/hwi-middle.cpp | 58 +++++++++++++++++ search-in-rotated-sorted-array/hwi-middle.cpp | 38 +++++++++++ 5 files changed, 204 insertions(+) create mode 100644 course-schedule/hwi-middle.cpp create mode 100644 invert-binary-tree/hwi-middle.cpp create mode 100644 jump-game/hwi-middle.cpp create mode 100644 merge-k-sorted-lists/hwi-middle.cpp create mode 100644 search-in-rotated-sorted-array/hwi-middle.cpp diff --git a/course-schedule/hwi-middle.cpp b/course-schedule/hwi-middle.cpp new file mode 100644 index 0000000000..f921df1b79 --- /dev/null +++ b/course-schedule/hwi-middle.cpp @@ -0,0 +1,64 @@ +class Solution { +private: + enum class eVisitStatus + { + Unvisited, + Visiting, + Visited + }; + +public: + bool canFinish(int numCourses, vector>& prerequisites) { + vector> graph(numCourses); + + for (auto& p : prerequisites) + { + int course = p[0]; + int prerequisite = p[1]; + + graph[course].push_back(prerequisite); + } + + vector status(numCourses, eVisitStatus::Unvisited); + + for (int i = 0; i < numCourses; ++i) + { + if (status[i] == eVisitStatus::Unvisited) + { + if (!dfs(i, graph, status)) + { + return false; + } + } + } + + return true; + } + +private: + bool dfs(int course, vector>& graph, vector& status) + { + if (status[course] == eVisitStatus::Visiting) + { + return false; + } + + if (status[course] == eVisitStatus::Visited) + { + return true; + } + + status[course] = eVisitStatus::Visiting; + + for (int prerequisite : graph[course]) + { + if (!dfs(prerequisite, graph, status)) + { + return false; + } + } + + status[course] = eVisitStatus::Visited; + return true; + } +}; diff --git a/invert-binary-tree/hwi-middle.cpp b/invert-binary-tree/hwi-middle.cpp new file mode 100644 index 0000000000..aa37163f27 --- /dev/null +++ b/invert-binary-tree/hwi-middle.cpp @@ -0,0 +1,26 @@ +/** + * 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 { +public: + TreeNode* invertTree(TreeNode* root) { + if (root == nullptr || (root->left == nullptr && root->right == nullptr)) + { + return root; + } + + invertTree(root->left); + invertTree(root->right); + swap(root->left, root->right); + + return root; + } +}; diff --git a/jump-game/hwi-middle.cpp b/jump-game/hwi-middle.cpp new file mode 100644 index 0000000000..f9005dbe30 --- /dev/null +++ b/jump-game/hwi-middle.cpp @@ -0,0 +1,18 @@ +class Solution { +public: + bool canJump(vector& nums) { + int maxDist = 0; + + for (int i = 0; i < nums.size(); ++i) + { + if (maxDist < i) + { + return false; + } + + maxDist = max(maxDist, i + nums[i]); + } + + return true; + } +}; diff --git a/merge-k-sorted-lists/hwi-middle.cpp b/merge-k-sorted-lists/hwi-middle.cpp new file mode 100644 index 0000000000..40d4d2b4a7 --- /dev/null +++ b/merge-k-sorted-lists/hwi-middle.cpp @@ -0,0 +1,58 @@ +/** + * 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: + struct cmp + { + bool operator() (ListNode* a, ListNode* b) + { + return a->val > b->val; + } + }; + +public: + ListNode* mergeKLists(vector& lists) { + if (lists.empty()) + { + return nullptr; + } + + priority_queue, cmp> pq; + + for (ListNode* list: lists) + { + while (list != nullptr) + { + pq.push(list); + list = list->next; + } + } + + if (pq.empty()) + { + return nullptr; + } + + ListNode* res = pq.top(); + ListNode* prev = res; + while (!pq.empty()) + { + ListNode* n = pq.top(); + pq.pop(); + prev->next = n; + prev = n; + } + + prev->next = nullptr; + + return res; + } +}; diff --git a/search-in-rotated-sorted-array/hwi-middle.cpp b/search-in-rotated-sorted-array/hwi-middle.cpp new file mode 100644 index 0000000000..d9d9d4d8ed --- /dev/null +++ b/search-in-rotated-sorted-array/hwi-middle.cpp @@ -0,0 +1,38 @@ +class Solution { +public: + int search(vector& nums, int target) { + return searchImpl(nums, 0, nums.size() - 1, target); + } + +private: + int searchImpl(vector& nums, int start, int end, int target) + { + if (start > end) + { + return -1; + } + + int mid = (start + end) / 2; + if (nums[mid] == target) + { + return mid; + } + + if (nums[start] <= nums[mid]) + { + if (nums[start] <= target && nums[mid] >= target) + { + return searchImpl(nums, start, mid - 1, target); + } + + return searchImpl(nums, mid + 1, end, target); + } + + if (nums[mid] <= target && nums[end] >= target) + { + return searchImpl(nums, mid + 1, end, target); + } + + return searchImpl(nums, start, mid - 1, target); + } +};