4 つの境目を狭めながら、行列を渦巻きの順に読む

m×n の行列を、左上から時計回りに外側の枠から内側へ渦巻きの順に読んだ並びを返します。上、下、左、右の 4 つの境目を持ち、1 辺を読むたびに 1 つ狭める練習です。

海外で定番の問題リスト 4 本には入っていません

問題

倉庫の棚の区画が、m 行 n 列の整数の行列 matrix で表されています。見回りのロボットは左上の区画から出発し、右へ進み、端に着いたら下へ、次に左へ、次に上へと、時計回りに曲がりながら、まだ通っていない区画だけを通って内側へ進みます。ロボットが通った順に区画の値を並べて返す関数を書いてください。

  • どの区画もちょうど 1 回ずつ通ります。答えの長さは m × n です
  • m と n はどちらも 1 以上 10 以下、値はどれも -100 以上 100 以下です

入力と出力の例

例 1

外側の枠を 1 周したあと、内側の 21 と 22 を読みます。

matrix = [[10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33]]
[10, 11, 12, 13, 23, 33, 32, 31, 30, 20, 21, 22]

例 2

1 列だけなら、上から下へ読んで終わりです。

matrix = [[4], [5], [6]]
[4, 5, 6]

例 3

縦に長い 4 行 2 列です。右へ 1 歩、下へ、左へ 1 歩、上へと 1 周で全部を通ります。

matrix = [[1, 2], [3, 4], [5, 6], [7, 8]]
[1, 2, 4, 6, 8, 7, 5, 3]

面接での聞かれ方

面接では、行列の扱いに慣れているかを見る問題として出されます。

  • 「行列を渦巻きの順で返してください」
  • 正方形の例で説明されたあと、「行と列の数が違うときも動きますか?」と確かめられます
  • 書き終えたあとに「1 行だけ、1 列だけのときをたどってください」と言われることがあります

考え方は難しくありませんが、境目の数え間違いで同じ区画を 2 回読みやすい問題です。端の場合を自分で確かめられるかが見られています。

ヒント

まだ開いていません

付箋は 4 枚。下の段ほど答えに近づきます

  1. ヒント 2

  2. ヒント 3

  3. ヒント 4答えに近い

アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。

配列と文字列の問題は、全部の組を調べると手間が大きくなる所を、窓や左右の添字で減らす形が多いです。

main.py
def spiral_order(matrix: list[list[int]]) -> list[int]:
    """
    Goal: 何を返すか

    idea1: まず思いつく案
    -> runtime: O(?)  space: O(?)

    idea2: もっと速い案
    -> runtime: O(?)  space: O(?)

    edge case: 空、1 つだけ、など
    """
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(spiral_order([[10, 11, 12, 13], [20, 21, 22, 23], [30, 31, 32, 33]]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します