🐙

NeetCode 150 [Stack]:medium 4/5

に公開

NeetCodeのSolutionを書いていく

Daily Temperatures

問題概要

気温の配列temperaturesが与えられます。
添字番目の日の気温をあらわします。
i番目の気温が次により暖かくなる日までの必須雨を返しなさい。
そのような日がない場合は0を返しなさい。

制約

  • 入力の配列長さは1以上1000以下
  • 気温は1以上100以下

計算時間:O(n)
メモリ:O(n)
nは入力配列サイズ

Input: temperatures = [30,38,30,36,35,40,28]
Output: [1,4,1,2,1,0,0]

Input: temperatures = [22,21,20]
Output: [0,0,0]

メモ

力技でやるなら、それぞれ次に暖かくなる日を探すだけで良い。
ただ、それだとO(n^2)になりそう。
スタックというお題でO(n)で実装する。
補助スタック?

全然わからなくて悔しい。
答え見た。以下の要領で実装する。

  • 各日の気温を日付昇順で(入力のまま)Stackに積む
  • Stackに積む時に、スタックの最後のデータと比較して積む気温より低ければpopし日付差分を計算し、戻り値に追加する

比較が必ず過去データとの比較なのでStack pushしながら比較すれば良い。
日付をまたいで比較する必要があるのでpopして比較を続ける
Stackのデータは順次評価されるので上の方のデータが比較でFalseとなればそれ以上比較する必要がない

from typing import List


class Solution:
    def dailyTemperatures(self, temperatures: List[int]) -> List[int]:
        Stack: List = []
        result = [0 for _ in range(len(temperatures))]

        for i, t in enumerate(temperatures):
            while Stack and Stack[-1][1] < t:  # 最後の気温が今回の気温より低い
                idx, _ = Stack.pop()
                result[idx] = i - idx
            Stack.append([i, t])

        return result

Discussion