スタックで今日より暖かい日まで何日待つかを並べる

毎日の気温の並びから、日ごとに「今日より暖かい日が来るまで何日待つか」を並べます。まだ答えの決まらない日をスタックに積み、暖かい日が来たらまとめて答えを決める、単調スタックの練習です。

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

問題

毎日の最高気温を、日の順に整数の並び temps で受け取ります。日ごとに、その日より後で、その日より気温が高い最初の日まで何日あるかを並べて返す関数を書いてください。

  • 返す並びの i 番目は、i 日目より後で temps[i] より高い気温の最初の日を j 日目としたときの j - i です
  • そういう日が無ければ 0 にします。同じ気温の日は、暖かい日と数えません
  • temps の長さは 1 以上 100000 以下で、値は -50 以上 50 以下です

入力と出力の例

例 1

1 日目の 18 度より暖かいのは、3 日後の 21 度が最初です。21 度の日は、2 日後の 22 度まで待ちます。最後の日は後ろに日が無いので 0 です。

temps = [18, 16, 17, 21, 19, 22]
[3, 1, 1, 2, 1, 0]

例 2

毎日下がっていくので、どの日も暖かい日は来ません。

temps = [25, 24, 23]
[0, 0, 0]

例 3

同じ気温は暖かい日と数えません。1 日目の 20 度は、2 日目の 20 度を飛ばして 3 日目の 21 度まで待ちます。

temps = [20, 20, 21]
[2, 1, 0]

面接での聞かれ方

面接では、気温の言葉のまま渡されることがよくあります。

  • 「毎日の気温から、より暖かい日まで何日待つかを返してください」
  • 「同じ気温は暖かいと数えますか?」と、自分から確かめるかを見られます
  • 書き終えたあとに「同じ考えで解ける問題をほかに知っていますか?」と聞かれることもあります

「次に大きい値」を探す問題は、株価、建物の見晴らし、ヒストグラムなど、形を変えてよく出ます。単調スタックという名前とあわせて覚えておくと、話を広げられます。

ヒント

まだ開いていません

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

  1. ヒント 2

  2. ヒント 3

  3. ヒント 4答えに近い

アルゴリズムのチートシートの「スタックとキュー」に、この型の要点を表とコードでまとめています。

スタックは後から入れた物を先に、キューは先に入れた物を先に取り出します。括弧の対応や、順番待ちの処理の形です。

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

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

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

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


# 「実行」を押すと、この行の結果が出ます
print(days_until_warmer([18, 16, 17, 21, 19, 22]))

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