スタックで 今日より 暖かい 日まで 何日待つかを並べる
毎日の
海外で定番の問題リスト 4 本には入っていません
問題
毎日のtemps で
- 返す
並びの i 番目は、 i 日目より 後で temps[i]より高い 気温の 最初の 日を j 日目とした ときの j - i です - そういう
日が 無ければ 0 にします。 同じ 気温の 日は、 暖かい 日と 数えません tempsの長さは 1 以上 100000 以下で、 値は -50 以上 50 以下です
入力と出力の例
例 1
1 日目の 18 度より
例 2
毎日下がっていくので、
例 3
同じ
面接での聞かれ方
面接では、
- 「毎日の
気温から、 より 暖かい 日まで 何日待つかを 返してください」 - 「同じ
気温は 暖かいと 数えますか?」と、 自分から 確かめるかを 見られます - 書き終えた
あとに 「同じ 考えで 解ける 問題を ほかに 知っていますか?」と 聞かれる こともあります
「次に大きい値」を
ヒント
まだ開いていません
付箋は 4 枚。下の段ほど答えに近づきます
ヒント 2
ヒント 3
ヒント 4答えに近い
アルゴリズムのチートシートの「スタックとキュー」に、
関わる学び
スタックは
まず 考える手順
段 1
素直に
段 2
見方を
段 3
答えの
段 4
スタックには、
解答
Python
Python
def days_until_warmer(temps):
ans = [0] * len(temps)
stack = []
for i in range(len(temps)):
t = temps[i]
while stack:
j = stack[-1]
if temps[j] >= t:
break
stack.pop()
ans[j] = i - j
stack.append(i)
return ansJavaScript
JavaScript
function daysUntilWarmer(
temps
) {
const n = temps.length;
const ans = Array(n).fill(0);
const stack = [];
for (let i = 0; i < n; i++) {
const t = temps[i];
while (stack.length > 0) {
const j = stack.at(-1);
if (temps[j] >= t) break;
stack.pop();
ans[j] = i - j;
}
stack.push(i);
}
return ans;
}Go
Go
func daysUntilWarmer(
temps []int,
) []int {
ans := make([]int, len(temps))
stack := []int{}
for i, t := range temps {
for len(stack) > 0 {
top := len(stack) - 1
j := stack[top]
if temps[j] >= t {
break
}
stack = stack[:top]
ans[j] = i - j
}
stack = append(stack, i)
}
return ans
}stack には、t 以上>= に
計算量
- 時間は O(n) です。
どの 日も、 積まれるのが 1 回、 取り出されるのが 多くて 1 回です。 取り出す繰り返しも、 全体で n 回を 越えません - 使う
記憶は O(n) です。 下がり続ける 並びでは、 全部の 日が スタックに 残ります。 答えの 並びは 数えていません - 段 1 の
後ろを 順に 見る 書き方は、 時間が O(n²) です
よく ある間違い
- 同じ
気温でも 取り出す。 条件を >ではなく>=で止めないと、 例 3 の 1 日目の 答えが 1 に なります。 同じ 気温は 暖かい 日では ありません - スタックに
気温を積む。 答えに 要るのは 日の 差なので、 気温だけでは 答えを 書けません。 番号を 積み、 気温は 並びから読みます - 答えを
日の 番号 j の まま入れる。 求めるのは 待つ 日数なので、 i - jです - 残った
日の 答えを -1 にする。 暖かい 日が 来ない ときは 0 です。 最初に 0 で 埋めて おけば、 何もしなくて済みます
解答を動かした版 Python 3.14.7Node.js 24.22.1Go 1.24.2確認日 2026年11月8日
面接での 話し方の例
書き始める
「前から
読みながら、 まだ 暖かい 日が 来ていない 日の 番号を スタックに 積みます。 スタックの 中の 気温は 上ほど 低い 並びに なります。 新しい 日の 気温が 上の 日より 高ければ、 取り出して その 日の 答えを 番号の 差で 決め、 高くなくなるまで 続けます。 どの 日も 1 回積まれて 多くて 1 回取り出されるので、 時間は O(n) です。」
書き終えたら、
「例 1 で
たどります。 18 を 積み、 16 も 低いので 積みます。 17 で 16 を 取り出して 答え 1、 17 を 積みます。 21 で 17 を 取り出して 1、 18 を 取り出して 3、 21 を 積みます。 19 を 積み、 22 で 19 に 1、 21 に 2 を 入れます。 22 は 最後まで 残って 0 です。」