ゼロから始めるLeetCode Day50「739. Daily Temperatures」

概要

海外ではエンジニアの面接においてコーディングテストというものが行われるらしく、多くの場合、特定の関数やクラスをお題に沿って実装するという物がメインである。

どうやら多くのエンジニアはその対策としてLeetCodeなるサイトで対策を行うようだ。

早い話が本場でも行われているようなコーディングテストに耐えうるようなアルゴリズム力を鍛えるサイトであり、海外のテックカンパニーでのキャリアを積みたい方にとっては避けては通れない道である。

と、仰々しく書いてみましたが、私は今のところそういった面接を受ける予定はありません。

ただ、ITエンジニアとして人並みのアルゴリズム力くらいは持っておいた方がいいだろうということで不定期に問題を解いてその時に考えたやり方をメモ的に書いていこうかと思います。

Leetcode

Python3で解いています。
Twitterやってます。

ゼロから始めるLeetCode 目次

前回
ゼロから始めるLeetCode Day49 「1323. Maximum 69 Number」
次回
ゼロから始めるLeetCode Day51 「647. Palindromic Substrings」

Twitterやってます。

問題

739. Daily Temperatures
難易度はMedium。
Top 100 Liked Questionsからの抜粋です。

問題としては、それぞれの日の気温を格納したリストであるTが与えられます。
それらの要素が入力の各日より暖かい気温になるまで何日かかるかを示すリストを返すアルゴリズムを設計してください。

例えば、T = [73、74、75、71、69、72、76、73]である場合、返すリストは[1、1、4、2、1、1、0、0]となります。

なお、気温の長さは[1,30000]、各気温は[30,100]の間で与えられるものとします。

問題を見た時、最初はえ??なんで出力がこうなるの?と思いましたが、よくよく見てみたら自分の理解力が低いだけでした。

次の日との差とかではなく、単純に何日後にその日の気温を超えるかを導けば良いだけなんですね。

解法

最初に0が要素の長さ分入ったリストを用意してあげて、素直にリストを舐めていくのが分かりやすいかと思いました。
stackを使えばLIFOなので、より簡単に実装できるでしょう。

例の場合でしたら、stackと[0]Tの長さの分だけ最初に用意します。
そこからリストを舐めていきましょう。

ここで大事なのは、どういった条件付けで代入を行い、そして要素をずらすためにはどういった処理を行えば良いかという点でしょう。

この場合であれば、stackが存在し、かつT[stack[-1]]が 前から舐めていった際の要素よりも大きい場合にのみansの要素をポップし、要素の順番からstackの最後の要素を引いたものを入れれば良い、ということになります。

そして、stackにインデックスを追加し、要素がなくなるまで繰り返し行えばansの中に各日程の所要日数が取れると思います。

ここまでの流れを書いてみました。

class Solution(object):
    def dailyTemperatures(self, T):
        ans,stack = [0] * len(T),[]
        for i, j in enumerate(T):
            while stack and T[stack[-1]] < j:
                ans[stack.pop()] = i - stack[-1]
            stack.append(i)
        return ans
# Runtime: 548 ms, faster than 32.01% of Python3 online submissions for Daily Temperatures.
# Memory Usage: 17.1 MB, less than 95.07% of Python3 online submissions for Daily Temperatures.

おなじみのenumerateです。
forループの中でリスト(配列)などのイテラブルオブジェクトの要素と同時にインデックス番号(カウント、順番)を取得できる、というもので、こういったカウントと順番を両方取得して変数に代入できる優れものです。

Easy問題を何度か挟んでいたので久しぶりにこんな感じで頭を使いました。よくよく考えてみたら二点間の距離的な考え方もできそうですね。

今回はここまで。お疲れ様でした。

コメント

このブログの人気の投稿

Braveブラウザの同期機能をiPhoneで設定した話。

failed: unable to get local issuer certificate (_ssl.c:1123)と出たので解決した話

自作のChrome Extensionをインポートした時に "Invalid value for 'content_scripts[0].matches[0]': Empty path."というエラーが出たので解決した