From b045c2647f49b799ae00ccf00bc9bc5c822c619c Mon Sep 17 00:00:00 2001 From: Hurukawa2121 Date: Fri, 6 Dec 2024 22:28:02 +0900 Subject: [PATCH 1/2] =?UTF-8?q?remove-duplicates-from-sorted-list-II?= =?UTF-8?q?=E3=81=AE=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../memo.md | 9 ++++ .../step1.cpp | 33 +++++++++++++++ .../step2.cpp | 41 +++++++++++++++++++ .../step3.cpp | 41 +++++++++++++++++++ 4 files changed, 124 insertions(+) create mode 100644 1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md create mode 100644 1.linked-ist/remove-duplicates-from-sorted-list-II/step1.cpp create mode 100644 1.linked-ist/remove-duplicates-from-sorted-list-II/step2.cpp create mode 100644 1.linked-ist/remove-duplicates-from-sorted-list-II/step3.cpp diff --git a/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md b/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md new file mode 100644 index 0000000..3f880e3 --- /dev/null +++ b/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md @@ -0,0 +1,9 @@ +## step1 +- 時間計算量O(Nlog(N))、空間計算量O(N)。 +- mapのイテレーションは型が明確なのでautoを使う。 + +## step2 +- 線形に探索し、被りがあればheadを変更すると、時間計算量O(N)、空間計算量O(1)になることに気づき、実装する。 + +## step3 +- 3分ほどで実装。Step2でループごとの変数の動きをしっかり理解した点が大きかったと考える。 \ No newline at end of file diff --git a/1.linked-ist/remove-duplicates-from-sorted-list-II/step1.cpp b/1.linked-ist/remove-duplicates-from-sorted-list-II/step1.cpp new file mode 100644 index 0000000..7e4288b --- /dev/null +++ b/1.linked-ist/remove-duplicates-from-sorted-list-II/step1.cpp @@ -0,0 +1,33 @@ +#include + +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 { +public: + ListNode* deleteDuplicates(ListNode* head) { + std::map cnts; + while (head) { + cnts[head->val]++; + head = head->next; + } + ListNode *deleted_head = NULL; + for (auto [n, c] : cnts) { + if (c > 1) continue; + if (!head) { + deleted_head = new ListNode(n); + head = deleted_head; + } + else { + head->next = new ListNode(n); + head = head->next; + } + } + return deleted_head; + } +}; \ No newline at end of file diff --git a/1.linked-ist/remove-duplicates-from-sorted-list-II/step2.cpp b/1.linked-ist/remove-duplicates-from-sorted-list-II/step2.cpp new file mode 100644 index 0000000..b1fcb12 --- /dev/null +++ b/1.linked-ist/remove-duplicates-from-sorted-list-II/step2.cpp @@ -0,0 +1,41 @@ +#include + +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 { +public: + ListNode* deleteDuplicates(ListNode* head) { + ListNode* seek = head; + ListNode* pre = NULL; + ListNode* border; + int sequence_cnt; + while (seek) { + border = seek; + sequence_cnt = 0; + while (border->next && border->val == border->next->val) { + border = border->next; + sequence_cnt++; + } + if (sequence_cnt == 0) { + pre = seek; + seek = seek->next; + continue; + } + + if (!pre) { + seek = head = border->next; + } + else { + pre->next = border->next; + seek = border->next; + } + } + return head; + } +}; \ No newline at end of file diff --git a/1.linked-ist/remove-duplicates-from-sorted-list-II/step3.cpp b/1.linked-ist/remove-duplicates-from-sorted-list-II/step3.cpp new file mode 100644 index 0000000..c8a1166 --- /dev/null +++ b/1.linked-ist/remove-duplicates-from-sorted-list-II/step3.cpp @@ -0,0 +1,41 @@ +#include + +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 { +public: + ListNode* deleteDuplicates(ListNode* head) { + ListNode* seek = head; + ListNode* pre = NULL; + ListNode* border; + int sequence_cnt; + while (seek) { + border = seek; + sequence_cnt = 0; + while (border->next && border->val == border->next->val) { + border = border->next; + sequence_cnt++; + } + if (sequence_cnt == 0) { + pre = seek; + seek = seek->next; + continue; + } + + if (!pre) { + seek = head = border->next; + } + else { + pre->next = border->next; + seek = border->next; + } + } + return head; + } +}; \ No newline at end of file From af0ce37b9be2937aa739f641eaccc6226fe2b45f Mon Sep 17 00:00:00 2001 From: Hurukawa2121 Date: Fri, 6 Dec 2024 22:37:06 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=83=A1=E3=83=A2=E5=8A=A0=E7=AD=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md b/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md index 3f880e3..d46dd04 100644 --- a/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md +++ b/1.linked-ist/remove-duplicates-from-sorted-list-II/memo.md @@ -1,9 +1,12 @@ ## step1 +- 出現が1回の要素から成る新しいリストを返す。 - 時間計算量O(Nlog(N))、空間計算量O(N)。 - mapのイテレーションは型が明確なのでautoを使う。 ## step2 - 線形に探索し、被りがあればheadを変更すると、時間計算量O(N)、空間計算量O(1)になることに気づき、実装する。 +- 用途などはあまり分からず、パフォーマンス要件の考察は断念 + - 「複数回呼び出される関数に見えるので、どちらの計算量は少ない方が良い」という当たり前の考察しかできなかった。 ## step3 -- 3分ほどで実装。Step2でループごとの変数の動きをしっかり理解した点が大きかったと考える。 \ No newline at end of file +- 3分ほどで実装。Step2でループごとの変数の動きをしっかり理解したため詰まらず実装できた。 \ No newline at end of file