問題
あるprices を
- 買う
日は 売る 日より 前でなければなりません。 同じ 日に 買って 売る ことは できません - どう
売り 買いしても 利益が 出ない ときは、 売り 買いを しない ことにして 0 を返します pricesの長さは 1 以上 100000 以下、 値段は どれも 0 以上 10000 以下です
入力と出力の例
例 1
値段 2 の
入力
prices = [8, 3, 6, 2, 7, 4]出力
5例 2
値段が
入力
prices = [9, 7, 4, 1]出力
0例 3
いちばん安い
入力
prices = [2, 10, 1, 5]出力
8面接での聞かれ方
面接では、
- 「株価の
配列が あります。 1 回だけ 買って 売る とき、 最大の 利益は いくらですか?」 - 「最安値で
買って 最高値で 売れば よいのでは?」と、 わざと 落とし穴へ 誘う形で 聞かれる こともあります - 書き終えた
あとに 「何回でも 売り 買い できたら どうしますか?」と、 条件を 変えた 続きが 出る ことがあります
最初に、
アルゴリズムのチートシートの「配列と文字列」に、この型の要点を表とコードでまとめています。
まず 考える手順
段 1
まずは
段 2
売る
段 3
これを
解答
Python
Python
def max_profit(prices):
low = prices[0]
best = 0
for p in prices:
if p < low:
low = p
gain = p - low
if gain > best:
best = gain
return bestJavaScript
JavaScript
function maxProfit(prices) {
let low = prices[0];
let best = 0;
for (const p of prices) {
if (p < low) {
low = p;
}
const gain = p - low;
if (gain > best) {
best = gain;
}
}
return best;
}Go
Go
func maxProfit(
prices []int,
) int {
low := prices[0]
best := 0
for _, p := range prices {
if p < low {
low = p
}
gain := p - low
if gain > best {
best = gain
}
}
return best
}low がp がbest を 0 から
計算量
- 時間は O(n) です。
値段の 並びを 前から 1 回なめるだけです - 使う
記憶は O(1) です。 最安値と、 いちばん 大きい利益の 置き場だけです - 段 1 の
全部の 組を 試す 書き方は、 時間が O(n²) です。 「売る 日ごとの 最安の 買う 日」を 覚えておく ことで、 組を 試す手間が 要らなくなりました
よく ある間違い
- 全体の
最安値と 最高値の 差を返す。 例 3 の [2, 10, 1, 5]では、最安の 1 は 最高の 10 より 後なので、 9 は 答えに なりません。 買う 日は 売る 日より前です - 利益が
出ない ときに 負の 数を返す。 bestを最初の 2 日の 差や、 とても 小さい 数から 始めると、 例 2 で -2 のような 値が 残ります。 売り 買いしない 0 から始めます - 長さが 1 の
ときに 2 日目を読む。 prices[1]から始める 書き方は、 1 日しか 無い 並びで 並びの 外を 読みます。 prices[0]を最安値に して、 全部の 日を回します - 最安値を
変えた 日に、 前の 最安値まで 忘れてよいか迷う。 新しい 最安値より 後の 日に 売るなら、 前の 最安値で 買うより 必ず得なので、 前の 値は 要りません。 それより 前の 日の 利益は、 もう bestに入っています
解答を動かした版 Python 3.12.14Node.js 22.23.4Go 1.24.6確認日 2026年10月30日
面接での 話し方の例
書き始める
「買う
日と 売る 日の 組を 全部試すと O(n²) です。 売る 日を 決めると、 いちばんよい 買う 日は それより 前の 最安の 日なので、 前から 見ながら 最安値を 覚えておけば、 その 日に 売る 利益が すぐ出ます。 窓の 左端を 最安の 日、 右端を いまの 日と 見て、 右端を 1 日ず つ進めます。 時間は O(n)、 記憶は O(1) で、 利益が 出なければ 0 を 返します。」
書き終えたら、
「例 3 の
[2, 10, 1, 5]でたどります。 最安値 2 のまま 10 の 日に 売ると 8 です。 1 の 日に 最安値を 1 に 変えます。 5 の 日に 売ると 4 で、 8 より 小さいので 答えは 8 のままです。 最安値を 変えても、 それまでの 8 は 残っています。」
