メインコンテンツへスキップ

NeetCode 150 [Stack]:medium 4/5

· loading · loading ·
kiitosu
著者
kiitosu
画像処理やデバイスドライバ、データ基盤構築からWebバックエンドまで、多様な領域に携わってきました。地図解析や地図アプリケーションの仕組みにも経験があり、幅広い技術を活かした開発に取り組んでいます。休日は草野球とランニングを楽しんでいます。
目次

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
Reply by Email

関連記事

NeetCode 150 [Stack]:medium 3/5
· loading · loading
NeetCode 150 [Stack]:medium 2/5
· loading · loading
NeetCode 150 [Stack]:medium 1/5
· loading · loading