From 4c746f360f41554c7b3509a165592b6e013bcf10 Mon Sep 17 00:00:00 2001 From: tom4649 Date: Thu, 18 Jun 2026 05:53:19 +0900 Subject: [PATCH 1/2] 735. Asteroid Collision --- 0088.Merge-Sorted-Array/memo.md | 26 ++++++++++++++++ 0735.Asteroid-Collision/memo.md | 32 +++++++++++++++++++ 0735.Asteroid-Collision/step1.py | 34 +++++++++++++++++++++ 0735.Asteroid-Collision/step2.py | 21 +++++++++++++ 0735.Asteroid-Collision/step2_while_else.py | 16 ++++++++++ 0735.Asteroid-Collision/step3.py | 19 ++++++++++++ 6 files changed, 148 insertions(+) create mode 100644 0088.Merge-Sorted-Array/memo.md create mode 100644 0735.Asteroid-Collision/memo.md create mode 100644 0735.Asteroid-Collision/step1.py create mode 100644 0735.Asteroid-Collision/step2.py create mode 100644 0735.Asteroid-Collision/step2_while_else.py create mode 100644 0735.Asteroid-Collision/step3.py diff --git a/0088.Merge-Sorted-Array/memo.md b/0088.Merge-Sorted-Array/memo.md new file mode 100644 index 0000000..76fbf29 --- /dev/null +++ b/0088.Merge-Sorted-Array/memo.md @@ -0,0 +1,26 @@ +# 88. Merge Sorted Array + +## step1 + +4mほど。マージソートとは設定が異なるようだ。配列の末尾から並べていくことがポイント。 + +## step2 + +条件分岐に不要なところがあったので改善。 + +merge sortに近いものも書く。 + +## 他の人のコード + +https://github.com/sota009/swe-coding-practice/pull/1 + +> あってもいいと思います。m == 0 のほうは私は消すかもしれません。書き終わった直後に、これなくてもいいですかね、とコメントするとわりと読み慣れている人だなと思います。 + +色々と考えてコードを書いている。 + +> "In many ways the object returned by range() behaves as if it is a list, but in fact it isn't. It is an object which returns the successive items of the desired sequence when you iterate over it, but it doesn't really make the list, thus saving space." https://docs.python.org/3/tutorial/controlflow.html + +> スペースは食わないみたい + +## step3 +今回は省略 diff --git a/0735.Asteroid-Collision/memo.md b/0735.Asteroid-Collision/memo.md new file mode 100644 index 0000000..a5aba47 --- /dev/null +++ b/0735.Asteroid-Collision/memo.md @@ -0,0 +1,32 @@ +# 735. Asteroid Collision + +## step1 +自然に左から順に処理していけばよい。23mほどかかった。 + +間違えた点: +- 絶対値が等しい時の処理を忘れた +- 最後に右に動いているasteroidを加えるのを忘れた + +時間計算量、空間計算量ともにO(n) + +## step2 +解答を一瞬見るとスタックは一つで十分らしいことが分かったので考え直す。大きくシンプルになった。 + +まだ答えがあっていても最もシンプルなコードに直接辿りつけないことがある。 + +## 他の解法 + +https://leetcode.com/problems/asteroid-collision/solutions/8325855/stack-collision-simulation-on-beats-9415-66yi/ + +while else という文法を知らなかった。基礎的な話なのかもしれない。 + +https://docs.python.org/3/reference/compound_stmts.html#the-while-statement + +> while_stmt: "while" assignment_expression ":" suite + > ["else" ":" suite] + + +## step3 + +処理を少しだけまとめた。 + diff --git a/0735.Asteroid-Collision/step1.py b/0735.Asteroid-Collision/step1.py new file mode 100644 index 0000000..72bc586 --- /dev/null +++ b/0735.Asteroid-Collision/step1.py @@ -0,0 +1,34 @@ +class Solution: + def asteroidCollision(self, asteroids: list[int]) -> list[int]: + asteroids_moving_left = [] + asteroids_moving_right = [] + for asteroid in asteroids: + if asteroid > 0: + asteroids_moving_right.append((asteroid, len(asteroids_moving_left))) + else: + while asteroids_moving_right and asteroids_moving_right[-1][0] < abs( + asteroid + ): + asteroids_moving_right.pop() + if asteroids_moving_right and asteroids_moving_right[-1][0] == abs( + asteroid + ): + asteroids_moving_right.pop() + continue + if not asteroids_moving_right: + asteroids_moving_left.append(asteroid) + + result = [] + index_moving_right = 0 + for i in range(len(asteroids_moving_left) + 1): + while index_moving_right < len(asteroids_moving_right) and ( + i == len(asteroids_moving_left) + or i >= asteroids_moving_right[index_moving_right][1] + ): + asteroid, _ = asteroids_moving_right[index_moving_right] + result.append(asteroid) + index_moving_right += 1 + if i < len(asteroids_moving_left): + result.append(asteroids_moving_left[i]) + + return result diff --git a/0735.Asteroid-Collision/step2.py b/0735.Asteroid-Collision/step2.py new file mode 100644 index 0000000..115f3ea --- /dev/null +++ b/0735.Asteroid-Collision/step2.py @@ -0,0 +1,21 @@ +class Solution: + def asteroidCollision(self, asteroids: list[int]) -> list[int]: + stack = [] + for asteroid in asteroids: + if asteroid > 0: + stack.append(asteroid) + continue + + while stack and stack[-1] > 0 and stack[-1] < abs(asteroid): + stack.pop() + + if stack and stack[-1] == abs(asteroid): + stack.pop() + continue + + if stack and stack[-1] > abs(asteroid): + continue + + stack.append(asteroid) + + return stack diff --git a/0735.Asteroid-Collision/step2_while_else.py b/0735.Asteroid-Collision/step2_while_else.py new file mode 100644 index 0000000..453ceca --- /dev/null +++ b/0735.Asteroid-Collision/step2_while_else.py @@ -0,0 +1,16 @@ +class Solution: + def asteroidCollision(self, asteroids: list[int]) -> list[int]: + stack = [] + for asteroid in asteroids: + while asteroid < 0 and stack and stack[-1] > 0: + if stack[-1] == abs(asteroid): + stack.pop() + break + elif stack[-1] < abs(asteroid): + stack.pop() + else: + break + else: + stack.append(asteroid) + + return stack diff --git a/0735.Asteroid-Collision/step3.py b/0735.Asteroid-Collision/step3.py new file mode 100644 index 0000000..a1d8be0 --- /dev/null +++ b/0735.Asteroid-Collision/step3.py @@ -0,0 +1,19 @@ +class Solution: + def asteroidCollision(self, asteroids: list[int]) -> list[int]: + stack = [] + for asteroid in asteroids: + if asteroid > 0: + stack.append(asteroid) + continue + + while stack and stack[-1] > 0 and stack[-1] < abs(asteroid): + stack.pop() + + if stack and stack[-1] > 0: + if stack[-1] == abs(asteroid): + stack.pop() + continue + + stack.append(asteroid) + + return stack From 720fa070c2d3fe37fcdf1a9b0c26b9d227385610 Mon Sep 17 00:00:00 2001 From: tom4649 Date: Thu, 18 Jun 2026 06:00:27 +0900 Subject: [PATCH 2/2] Add solutions of others --- 0735.Asteroid-Collision/memo.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/0735.Asteroid-Collision/memo.md b/0735.Asteroid-Collision/memo.md index a5aba47..5d61a71 100644 --- a/0735.Asteroid-Collision/memo.md +++ b/0735.Asteroid-Collision/memo.md @@ -16,17 +16,28 @@ ## 他の解法 +https://github.com/sota009/swe-coding-practice/pull/2 + https://leetcode.com/problems/asteroid-collision/solutions/8325855/stack-collision-simulation-on-beats-9415-66yi/ while else という文法を知らなかった。基礎的な話なのかもしれない。 +> while-else への私の所感は、使ってもいいが、必要となる状況では関数化することなどによってより整理できる可能性が高い、というものです。 + https://docs.python.org/3/reference/compound_stmts.html#the-while-statement > while_stmt: "while" assignment_expression ":" suite > ["else" ":" suite] +> C言語だと、 a < b < c が a < b and b < cにならないそうです。 +> 言語間の違いを意識せずに済むという意味で、 +> andを省略せずに書いてあげるのが親切かなと思いました。 -## step3 +これは自分も同意する + + +## step3 +自分はwhile-elseを使いそうにないので、使わない方を書く。 処理を少しだけまとめた。