From 34a881ed9c921bce4fde7d083bff1f161c7585c5 Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Thu, 20 Nov 2025 03:53:41 +0900 Subject: [PATCH 1/5] 57. Insert Interval https://leetcode.com/problems/insert-interval/ --- 57_insert_interval/memo.md | 73 ++++++++++++++++++++++++++++++++++++ 57_insert_interval/step1.cpp | 61 ++++++++++++++++++++++++++++++ 57_insert_interval/step2.cpp | 26 +++++++++++++ 57_insert_interval/step3.cpp | 0 4 files changed, 160 insertions(+) create mode 100644 57_insert_interval/memo.md create mode 100644 57_insert_interval/step1.cpp create mode 100644 57_insert_interval/step2.cpp create mode 100644 57_insert_interval/step3.cpp diff --git a/57_insert_interval/memo.md b/57_insert_interval/memo.md new file mode 100644 index 0000000..3d0d0a3 --- /dev/null +++ b/57_insert_interval/memo.md @@ -0,0 +1,73 @@ +# 57. Insert Interval + +https://leetcode.com/problems/insert-interval/ + +## Comments + +### step1 + +* 大雑把な方針として、[interval_start, interval_end] の区間を掲げて、overlap しなくなるまで j を進める。j が進み終わったら、その時点の [interval_start, interval_end] を push_back という方針で考え始めた。 +* `SolutionWA1` + * しかし inner while のループ条件指定でなぜかドツボにハマって 50 分くらい考え込んでしまった + * 多分 `interval_end` (今掲げている範囲)、`newInterval` (引数で与えられた範囲)、`intervals[j]` (overlap していたので進めようとしている範囲) の 3 つを同時に処理しようとして、条件設定がよくわからなくなってしまった模様。 + * 最終的に `if (new_interval_start <= interval_end)` のように `newInterval` だけ別で処理し (一回の処理なので `if` だけでよい)、inner while では `interval_end` と `intervals[j]` に注目すればよいことに気づいて腹落ちした + * しかし `[], [5, 7]` のような入力に対して落ちてしまう。確かに overlap がない場合の処理ができないことに気づく +* ツギハギのようで嫌だなあと思いながら、`SolutionWA2` のようにフラグを立ててみる + * 最初、inner while にだけフラグを立てて、IN: `[[1,3],[6,9]], [2, 5]` -> OUT: `[[1,5],[6,9],[2,5]]` のようになってしまった + * `if (new_interval_start <= interval_end)` の中でもフラグを立てるようにした + * IN `[[1,5]], [0, 3]` -> OUT `[[1,5]]` (expect `[0, 5]`) のように前が extend されるケースが考慮されていない。 + * 1h 以上悩んだので一旦力尽きた + + +### step2 + +* https://github.com/huyfififi/coding-challenges/pull/26/files + * 一旦 step2 を見る。なるほど、overlap が発生する前、発生して skip する処理、残りの処理と段階を踏めばよかったのか… + * アイデアを見た段階で書き直した + * `step2.Solution`: ようやく AC した… + * 余力がなかったので再帰についての部分はスキップした +* https://github.com/huyfififi/coding-challenges/pull/26/files#r2184884440 + * `newInterval` を `intervals` に放り込んでソートしてから処理する、という発想はなかった (以下一応転載) + +```cpp +class Solution { +public: + vector> insert(vector>& intervals, vector& newInterval) { + intervals.push_back(newInterval); + std::sort(intervals.begin(), intervals.end()); + vector> merged; + vector last_interval = intervals.front(); + for (const auto& interval : intervals) { + if (last_interval[1] < interval[0]) { + merged.push_back(last_interval); + last_interval = interval; + } else { + last_interval[1] = max(last_interval[1], interval[1]); + } + } + + merged.push_back(last_interval); + return merged; + } +}; +``` + +* Python の `extend` + slice を C++ で書くとこんなかんじらしい。最後の while を書き換えられる + * とはいえ C++ だと while を使って書きたくなってしまう。十分単純なので。Python だと extend + slice という特有の syntax / function があるからいい気がするけど… + + +```py +result.extend(intervals[i:]) +``` + +```cpp +result.insert(result.end(), intervals.begin() + i, intervals.end()); +``` + +* しかし今回のドツボから学べることはなんだろう?またやりそうで怖い。 + * そもそも最初の、全部 1 ループで処理しようというのが複雑にする要因だったのだが、まあそれが必要なとき (inner loop) もあるわけで、どうやって見切りをつけるべきだったのか… + * なんか時々こういうのある気はする。ある特定の方針で書くと edge ケースの対応が妙にややこしくなるんだけど、別の procedure で考えると簡単、みたいな。ハマったときに切り替えられるとよいのだが面接でできる気がしないかも + +### step3 + +* skip diff --git a/57_insert_interval/step1.cpp b/57_insert_interval/step1.cpp new file mode 100644 index 0000000..bd73b47 --- /dev/null +++ b/57_insert_interval/step1.cpp @@ -0,0 +1,61 @@ +class SolutionWA1 { +public: + vector> insert(vector>& intervals, vector& newInterval) { + int new_interval_start = newInterval[0]; + int new_interval_end = newInterval[1]; + std::vector> result; + int i = 0; + bool has_overlap = false; + while (i < intervals.size()) { + int interval_start = intervals[i][0]; // Fixed + int interval_end = intervals[i][1]; // Temp. end. Not fixed yet. + if (new_interval_start <= interval_end) { + interval_end = std::max(interval_end, new_interval_end); + } + int j = i + 1; + + while (j < intervals.size() && intervals[j][0] <= interval_end) { + interval_end = std::max(interval_end, intervals[j][1]); + ++j; + } + result.push_back({interval_start, interval_end}); + i = j; + } + return result; + } +}; + + + +class SolutionWA2 { +public: + vector> insert(vector>& intervals, vector& newInterval) { + int new_interval_start = newInterval[0]; + int new_interval_end = newInterval[1]; + std::vector> result; + int i = 0; + bool has_overlap = false; + while (i < intervals.size()) { + int interval_start = intervals[i][0]; // Fixed + int interval_end = intervals[i][1]; // Temp. end. Not fixed yet. + if (new_interval_start <= interval_end) { + has_overlap = true; + interval_end = std::max(interval_end, new_interval_end); + } + int j = i + 1; + + while (j < intervals.size() && intervals[j][0] <= interval_end) { + has_overlap = true; + interval_end = std::max(interval_end, intervals[j][1]); + ++j; + } + result.push_back({interval_start, interval_end}); + i = j; + } + if (!has_overlap) { + result.push_back(newInterval); + return result; + } + return result; + } +}; diff --git a/57_insert_interval/step2.cpp b/57_insert_interval/step2.cpp new file mode 100644 index 0000000..bc4e4d7 --- /dev/null +++ b/57_insert_interval/step2.cpp @@ -0,0 +1,26 @@ +class Solution { +public: + vector> insert(vector>& intervals, vector& newInterval) { + std::vector> result; + int insertion_start = newInterval[0]; + int insertion_end = newInterval[1]; + int i = 0; + // No overlap -> push_back as is. + while (i < intervals.size() && intervals[i][1] < insertion_start) { + result.push_back(intervals[i++]); + } + // Handle overlaps + while (i < intervals.size() && intervals[i][0] <= insertion_end) { + insertion_start = std::min(insertion_start, intervals[i][0]); + insertion_end = std::max(insertion_end, intervals[i][1]); + ++i; + } + result.push_back({insertion_start, insertion_end}); + + // The rest (if remaining) + while (i < intervals.size()) { + result.push_back(intervals[i++]); + } + return result; + } +}; diff --git a/57_insert_interval/step3.cpp b/57_insert_interval/step3.cpp new file mode 100644 index 0000000..e69de29 From a67b17cf94775d281742d98bbbce041140870ed2 Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Thu, 20 Nov 2025 03:58:29 +0900 Subject: [PATCH 2/5] Fix unneeded line breaks --- 57_insert_interval/memo.md | 1 - 1 file changed, 1 deletion(-) diff --git a/57_insert_interval/memo.md b/57_insert_interval/memo.md index 3d0d0a3..ac5f2df 100644 --- a/57_insert_interval/memo.md +++ b/57_insert_interval/memo.md @@ -18,7 +18,6 @@ https://leetcode.com/problems/insert-interval/ * IN `[[1,5]], [0, 3]` -> OUT `[[1,5]]` (expect `[0, 5]`) のように前が extend されるケースが考慮されていない。 * 1h 以上悩んだので一旦力尽きた - ### step2 * https://github.com/huyfififi/coding-challenges/pull/26/files From 68bad8ca8d1efc7e158d05c2c4a1c7cc89691e97 Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Thu, 20 Nov 2025 04:08:49 +0900 Subject: [PATCH 3/5] Add thoughts on handling loop 1 and 2 --- 57_insert_interval/memo.md | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/57_insert_interval/memo.md b/57_insert_interval/memo.md index ac5f2df..0f6ea77 100644 --- a/57_insert_interval/memo.md +++ b/57_insert_interval/memo.md @@ -6,7 +6,7 @@ https://leetcode.com/problems/insert-interval/ ### step1 -* 大雑把な方針として、[interval_start, interval_end] の区間を掲げて、overlap しなくなるまで j を進める。j が進み終わったら、その時点の [interval_start, interval_end] を push_back という方針で考え始めた。 +* 大雑把な方針として、[interval_start, interval_end] の区間を掲げて、overlap しなくなるまで j を進める。j が進み終わったら、その時点の [interval_start, interval_end] を push_back という方針で考え始めた (この区間を extend していく感覚)。 * `SolutionWA1` * しかし inner while のループ条件指定でなぜかドツボにハマって 50 分くらい考え込んでしまった * 多分 `interval_end` (今掲げている範囲)、`newInterval` (引数で与えられた範囲)、`intervals[j]` (overlap していたので進めようとしている範囲) の 3 つを同時に処理しようとして、条件設定がよくわからなくなってしまった模様。 @@ -23,7 +23,14 @@ https://leetcode.com/problems/insert-interval/ * https://github.com/huyfififi/coding-challenges/pull/26/files * 一旦 step2 を見る。なるほど、overlap が発生する前、発生して skip する処理、残りの処理と段階を踏めばよかったのか… * アイデアを見た段階で書き直した - * `step2.Solution`: ようやく AC した… +* `step2.Solution`: ようやく AC した… + * これ、ループの条件で少し悩んだ。とぃうのも、1 つめのループと 2 つめのループで、メインの処理対象が異なる感覚。 + interval insertion みたいなのを考えるとき、2 本の数直線的なものを脳内でイメージしているのだが + * Loop1: `intervals[i]` が先行する数直線で、`newInterval` が後続。したがって、`intervals[i]` の end と、`newInterval` の start を比較。ここでは `insertion_start` と `insertion_end` は更新されない。 + * Loop2: `newInterval` (というか厳密には `insertion_start`, `insertion_end` で定義される区間 )が先行する数直線で、`intervals[i]` が後続。したがって、`newInterval` (というか `[insertion_start, insertion_en]`) の end と、`intervals[i]` の start を比較。 + * ちなみに step1 の extend していく感覚だと、なんとなく後ろにのみ extend される感覚があり、start の方の更新を忘れそう (step1 では実際忘れた) + * のように整理していないと、何と何を比較すればよいのかわからなくなりそう。 + * 余力がなかったので再帰についての部分はスキップした * https://github.com/huyfififi/coding-challenges/pull/26/files#r2184884440 * `newInterval` を `intervals` に放り込んでソートしてから処理する、という発想はなかった (以下一応転載) From 43d7c082a8e8bfb5f9b67ebed2d2d790c8b202aa Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Fri, 21 Nov 2025 03:42:04 +0900 Subject: [PATCH 4/5] 542. 01 Matrix https://leetcode.com/problems/01-matrix/ --- 542_01_matrix/memo.md | 41 ++++++++++++++++++++++++++++ 542_01_matrix/step1.cpp | 49 +++++++++++++++++++++++++++++++++ 542_01_matrix/step2.cpp | 60 +++++++++++++++++++++++++++++++++++++++++ 542_01_matrix/step3.cpp | 0 4 files changed, 150 insertions(+) create mode 100644 542_01_matrix/memo.md create mode 100644 542_01_matrix/step1.cpp create mode 100644 542_01_matrix/step2.cpp create mode 100644 542_01_matrix/step3.cpp diff --git a/542_01_matrix/memo.md b/542_01_matrix/memo.md new file mode 100644 index 0000000..37734d4 --- /dev/null +++ b/542_01_matrix/memo.md @@ -0,0 +1,41 @@ +# 542. 01 Matrix + +https://leetcode.com/problems/01-matrix/ + +## Comments + +### step1 + +* 5:00 くらい考えた + * 最短経路なので、BFS あたりで解けそう + * `1 <= m, n <= 10^4` なので、愚直に 1 から初めて最も近い 0 を探すとなると、O((m * n)^2) になり、10^16? さすがに C++ でも通らないな… + * 0 から始めるとどうかな。複数の 1 を一気に更新できるから効率は良さそう +* このあたりまで考えて 5:00 くらい。本当にこの方針でいいのか自信がなかったのと、実装が割と煩雑になりそうだったのでハマる前に答えを見ることにした。 + * `1 <= m * n <= 10^4` を見逃していた。セルの数自体も 10^4 なのか。なら 10^8 くらいに収まるから行けるか + * BFS だと最初の訪問 == 最短経路になる。0 から初めて visited かどうかを管理しておくと、結局それぞれのセルは 1 回ずつしか訪れないので O(m * n) のオーダーに収まる。 + * 1 から始めると、BFS しても途中で訪問したセルの最短距離は確定しないのでややこしい + * 答えを見る前に、0 から始めるか 1 から始めるかの選択肢を持てていたのは良かった。しかし runtime の観点できれいに考えを整理できていなかった。また実装方法についても具体的に頭の中でシミュレーションできていなかったので答えに頼ることになった +* 答えも参考に書いてみた。 + * まあ素直な書き方なのだが、上記実装を具体的に考えられていなかったのは、最初に前処理として 0 を queue に突っ込んでおく、というのを考えられていなかったからだと思われる。 + * あとは割と素直な BFS + * `distance` の命名は `steps` でもよかったかもしれない + * vector 変数の初期化でサイズ指定などを忘れていた。今までは `push_back` していくだけのものが多かったので失念。 + +```cpp +vector> distances(rows, vector(cols, 0)); +vector> visited(rows, vector(cols, false)); +``` + +### step2 + +* https://leetcode.com/problems/01-matrix/editorial/ + * あまりしっかり見れてはいない (TODO) のだが、DP での解法もあるみたい。まあ確かにできそうではある。 +* https://github.com/huyfififi/coding-challenges/pull/27 + * BFS で問題ないと思うのだが、`leetcode/542/step1_two_pass.py` の解答を一応 C++ で書き直してみた。 + * 最初 `numeric_limits` をそのまま使っていたのだが、+1 するケースがあり、そうすると overflow する。Gemini に進められたのでそのようにしてみた。でもこれ prod ではやりたくないな… 10000 という数字の選定も適当だし。 + * この解法、気持ちだけ DP っぽい雰囲気もする (前に確定した情報を使って次を更新していく) + +### step3 + +* skip +* 最終解答 (面接や prod だとしたら) としては step1 の BFS かなと思う diff --git a/542_01_matrix/step1.cpp b/542_01_matrix/step1.cpp new file mode 100644 index 0000000..602bc3c --- /dev/null +++ b/542_01_matrix/step1.cpp @@ -0,0 +1,49 @@ +#include + +class Solution { +public: + vector> updateMatrix(vector>& mat) { + int rows = mat.size(); + int cols = mat[0].size(); + vector> distances(rows, vector(cols, 0)); + vector> visited(rows, vector(cols, false)); + std::queue> cells_and_distances; + // Add zeros to the queue. + for (int row = 0; row < rows; ++row) { + for (int col = 0; col < cols; ++col) { + distances[row][col] = 0; + if (mat[row][col] == 0) { + cells_and_distances.push({row, col, 0}); + visited[row][col] = true; + } + } + } + + // BFS traversal + while (!cells_and_distances.empty()) { + vector info = cells_and_distances.front(); + cells_and_distances.pop(); + int row = info[0]; + int col = info[1]; + int distance = info[2]; + for (vector& direction : directions) { + int next_row = row + direction[0]; + int next_col = col + direction[1]; + if (!IsValid(next_row, next_col, rows, cols) || visited[next_row][next_col]) { + continue; + } + distances[next_row][next_col] = distance + 1; + visited[next_row][next_col] = true; + cells_and_distances.push({next_row, next_col, distance + 1}); + } + } + + return distances; + } +private: + vector> directions = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; + + bool IsValid(int row, int col, int rows, int cols) { + return 0 <= row && row < rows && 0 <= col && col < cols; + } +}; diff --git a/542_01_matrix/step2.cpp b/542_01_matrix/step2.cpp new file mode 100644 index 0000000..546fd5f --- /dev/null +++ b/542_01_matrix/step2.cpp @@ -0,0 +1,60 @@ +#include +#include + +using namespace std; + +class Solution { +public: + vector> updateMatrix(vector>& mat) { + int rows = mat.size(); + // if (rows == 0) return mat; + int cols = mat[0].size(); + // Use a safe "infinity" that won't overflow when adding 1 + int INF = numeric_limits::max() - 10000; + // Initialization: Set non-zero cells to inf. + for (int row = 0; row < rows; ++row) { + for (int col = 0; col < cols; ++col) { + if (mat[row][col] != 0) { + mat[row][col] = INF; + } + } + } + + // First pass: Check top and left neighbors + for (int row = 0; row < rows; ++row) { + for (int col = 0; col < cols; ++col) { + if (mat[row][col] == 0) { + continue; + } + + if (row > 0) { + // top (up) + mat[row][col] = min(mat[row][col], mat[row - 1][col] + 1); + } + if (col > 0) { + // left + mat[row][col] = min(mat[row][col], mat[row][col - 1] + 1); + } + } + } + + // Second pass: Check bottom and right neighbors (iterate backwards) + for (int row = rows - 1; row >= 0; --row) { + for (int col = cols - 1; col >= 0; --col) { + if (mat[row][col] == 0) { + continue; + } + + if (row < rows - 1) { + // bottom (down) + mat[row][col] = min(mat[row][col], mat[row + 1][col] + 1); + } + if (col < cols - 1) { + // right + mat[row][col] = min(mat[row][col], mat[row][col + 1] + 1); + } + } + } + return mat; + } +}; diff --git a/542_01_matrix/step3.cpp b/542_01_matrix/step3.cpp new file mode 100644 index 0000000..e69de29 From 30bf530c8b4038cb3cd3139d7fc7f656a89fe5e8 Mon Sep 17 00:00:00 2001 From: ryosuketc <43229670+ryosuketc@users.noreply.github.com> Date: Fri, 21 Nov 2025 03:43:23 +0900 Subject: [PATCH 5/5] Delete unrelated files --- 57_insert_interval/memo.md | 79 ------------------------------------ 57_insert_interval/step1.cpp | 61 ---------------------------- 57_insert_interval/step2.cpp | 26 ------------ 57_insert_interval/step3.cpp | 0 4 files changed, 166 deletions(-) delete mode 100644 57_insert_interval/memo.md delete mode 100644 57_insert_interval/step1.cpp delete mode 100644 57_insert_interval/step2.cpp delete mode 100644 57_insert_interval/step3.cpp diff --git a/57_insert_interval/memo.md b/57_insert_interval/memo.md deleted file mode 100644 index 0f6ea77..0000000 --- a/57_insert_interval/memo.md +++ /dev/null @@ -1,79 +0,0 @@ -# 57. Insert Interval - -https://leetcode.com/problems/insert-interval/ - -## Comments - -### step1 - -* 大雑把な方針として、[interval_start, interval_end] の区間を掲げて、overlap しなくなるまで j を進める。j が進み終わったら、その時点の [interval_start, interval_end] を push_back という方針で考え始めた (この区間を extend していく感覚)。 -* `SolutionWA1` - * しかし inner while のループ条件指定でなぜかドツボにハマって 50 分くらい考え込んでしまった - * 多分 `interval_end` (今掲げている範囲)、`newInterval` (引数で与えられた範囲)、`intervals[j]` (overlap していたので進めようとしている範囲) の 3 つを同時に処理しようとして、条件設定がよくわからなくなってしまった模様。 - * 最終的に `if (new_interval_start <= interval_end)` のように `newInterval` だけ別で処理し (一回の処理なので `if` だけでよい)、inner while では `interval_end` と `intervals[j]` に注目すればよいことに気づいて腹落ちした - * しかし `[], [5, 7]` のような入力に対して落ちてしまう。確かに overlap がない場合の処理ができないことに気づく -* ツギハギのようで嫌だなあと思いながら、`SolutionWA2` のようにフラグを立ててみる - * 最初、inner while にだけフラグを立てて、IN: `[[1,3],[6,9]], [2, 5]` -> OUT: `[[1,5],[6,9],[2,5]]` のようになってしまった - * `if (new_interval_start <= interval_end)` の中でもフラグを立てるようにした - * IN `[[1,5]], [0, 3]` -> OUT `[[1,5]]` (expect `[0, 5]`) のように前が extend されるケースが考慮されていない。 - * 1h 以上悩んだので一旦力尽きた - -### step2 - -* https://github.com/huyfififi/coding-challenges/pull/26/files - * 一旦 step2 を見る。なるほど、overlap が発生する前、発生して skip する処理、残りの処理と段階を踏めばよかったのか… - * アイデアを見た段階で書き直した -* `step2.Solution`: ようやく AC した… - * これ、ループの条件で少し悩んだ。とぃうのも、1 つめのループと 2 つめのループで、メインの処理対象が異なる感覚。 - interval insertion みたいなのを考えるとき、2 本の数直線的なものを脳内でイメージしているのだが - * Loop1: `intervals[i]` が先行する数直線で、`newInterval` が後続。したがって、`intervals[i]` の end と、`newInterval` の start を比較。ここでは `insertion_start` と `insertion_end` は更新されない。 - * Loop2: `newInterval` (というか厳密には `insertion_start`, `insertion_end` で定義される区間 )が先行する数直線で、`intervals[i]` が後続。したがって、`newInterval` (というか `[insertion_start, insertion_en]`) の end と、`intervals[i]` の start を比較。 - * ちなみに step1 の extend していく感覚だと、なんとなく後ろにのみ extend される感覚があり、start の方の更新を忘れそう (step1 では実際忘れた) - * のように整理していないと、何と何を比較すればよいのかわからなくなりそう。 - - * 余力がなかったので再帰についての部分はスキップした -* https://github.com/huyfififi/coding-challenges/pull/26/files#r2184884440 - * `newInterval` を `intervals` に放り込んでソートしてから処理する、という発想はなかった (以下一応転載) - -```cpp -class Solution { -public: - vector> insert(vector>& intervals, vector& newInterval) { - intervals.push_back(newInterval); - std::sort(intervals.begin(), intervals.end()); - vector> merged; - vector last_interval = intervals.front(); - for (const auto& interval : intervals) { - if (last_interval[1] < interval[0]) { - merged.push_back(last_interval); - last_interval = interval; - } else { - last_interval[1] = max(last_interval[1], interval[1]); - } - } - - merged.push_back(last_interval); - return merged; - } -}; -``` - -* Python の `extend` + slice を C++ で書くとこんなかんじらしい。最後の while を書き換えられる - * とはいえ C++ だと while を使って書きたくなってしまう。十分単純なので。Python だと extend + slice という特有の syntax / function があるからいい気がするけど… - - -```py -result.extend(intervals[i:]) -``` - -```cpp -result.insert(result.end(), intervals.begin() + i, intervals.end()); -``` - -* しかし今回のドツボから学べることはなんだろう?またやりそうで怖い。 - * そもそも最初の、全部 1 ループで処理しようというのが複雑にする要因だったのだが、まあそれが必要なとき (inner loop) もあるわけで、どうやって見切りをつけるべきだったのか… - * なんか時々こういうのある気はする。ある特定の方針で書くと edge ケースの対応が妙にややこしくなるんだけど、別の procedure で考えると簡単、みたいな。ハマったときに切り替えられるとよいのだが面接でできる気がしないかも - -### step3 - -* skip diff --git a/57_insert_interval/step1.cpp b/57_insert_interval/step1.cpp deleted file mode 100644 index bd73b47..0000000 --- a/57_insert_interval/step1.cpp +++ /dev/null @@ -1,61 +0,0 @@ -class SolutionWA1 { -public: - vector> insert(vector>& intervals, vector& newInterval) { - int new_interval_start = newInterval[0]; - int new_interval_end = newInterval[1]; - std::vector> result; - int i = 0; - bool has_overlap = false; - while (i < intervals.size()) { - int interval_start = intervals[i][0]; // Fixed - int interval_end = intervals[i][1]; // Temp. end. Not fixed yet. - if (new_interval_start <= interval_end) { - interval_end = std::max(interval_end, new_interval_end); - } - int j = i + 1; - - while (j < intervals.size() && intervals[j][0] <= interval_end) { - interval_end = std::max(interval_end, intervals[j][1]); - ++j; - } - result.push_back({interval_start, interval_end}); - i = j; - } - return result; - } -}; - - - -class SolutionWA2 { -public: - vector> insert(vector>& intervals, vector& newInterval) { - int new_interval_start = newInterval[0]; - int new_interval_end = newInterval[1]; - std::vector> result; - int i = 0; - bool has_overlap = false; - while (i < intervals.size()) { - int interval_start = intervals[i][0]; // Fixed - int interval_end = intervals[i][1]; // Temp. end. Not fixed yet. - if (new_interval_start <= interval_end) { - has_overlap = true; - interval_end = std::max(interval_end, new_interval_end); - } - int j = i + 1; - - while (j < intervals.size() && intervals[j][0] <= interval_end) { - has_overlap = true; - interval_end = std::max(interval_end, intervals[j][1]); - ++j; - } - result.push_back({interval_start, interval_end}); - i = j; - } - if (!has_overlap) { - result.push_back(newInterval); - return result; - } - return result; - } -}; diff --git a/57_insert_interval/step2.cpp b/57_insert_interval/step2.cpp deleted file mode 100644 index bc4e4d7..0000000 --- a/57_insert_interval/step2.cpp +++ /dev/null @@ -1,26 +0,0 @@ -class Solution { -public: - vector> insert(vector>& intervals, vector& newInterval) { - std::vector> result; - int insertion_start = newInterval[0]; - int insertion_end = newInterval[1]; - int i = 0; - // No overlap -> push_back as is. - while (i < intervals.size() && intervals[i][1] < insertion_start) { - result.push_back(intervals[i++]); - } - // Handle overlaps - while (i < intervals.size() && intervals[i][0] <= insertion_end) { - insertion_start = std::min(insertion_start, intervals[i][0]); - insertion_end = std::max(insertion_end, intervals[i][1]); - ++i; - } - result.push_back({insertion_start, insertion_end}); - - // The rest (if remaining) - while (i < intervals.size()) { - result.push_back(intervals[i++]); - } - return result; - } -}; diff --git a/57_insert_interval/step3.cpp b/57_insert_interval/step3.cpp deleted file mode 100644 index e69de29..0000000