diff --git a/122/step1.cpp b/122/step1.cpp new file mode 100644 index 0000000..9ef6240 --- /dev/null +++ b/122/step1.cpp @@ -0,0 +1,29 @@ +/* +--:-- + +Time complexity: O(n) +Space complexity: O(1) + +計算ミスをしてしまい、1円でも特になるなら常に売買してよい、という条件を見落としてしまう。 +底値で買って最高値で売るを繰り返すというコードを書こうとしたが、いまいちコードに落とし込めなかった。 +などのミスによって初見で解けなかったので解説などを見た + +全探索→DP→貪欲法という順序を進んでとければ良かったが、DPの構造を見出せなかったのでstep2以降で練習していく +自分の良くない思考の癖みたいなのをLLMとのやり取りの中で見つけられたので次回以降は改善していきたい +ボトムアップで考えず、ひらめきによるショートカットを試みようとする悪癖があり、それが出るとコードが書けなくてハマってしまう。 +全探索から考えていけるように練習していく + + +*/ +class Solution { +public: + int maxProfit(vector& prices) { + int max_benefit = 0; + for (int i = 1; i < prices.size(); ++i) { + if (prices[i] > prices[i - 1]) { + max_benefit += prices[i] - prices[i - 1]; + } + } + return max_benefit; + } +}; diff --git a/122/step2.cpp b/122/step2.cpp new file mode 100644 index 0000000..d7b1085 --- /dev/null +++ b/122/step2.cpp @@ -0,0 +1,20 @@ +/* + +株を持っている状態と持っていない状態に分けて、各状態で利益の多い値で更新していく方式。 +最初DPの構造が見えていなかったので、LLMと壁打ちしてその辺りの構造を理解した。 + +*/ + +class Solution { +public: + int maxProfit(vector& prices) { + int max_profit_with_stock = numeric_limits::min(); + int max_profit_without_stock = 0; + for (int i = 0; i < prices.size(); ++i) { + int tmp_max_profit_with_stock = max(max_profit_with_stock, max_profit_without_stock - prices[i]); + max_profit_without_stock = max(max_profit_without_stock, max_profit_with_stock + prices[i]); + max_profit_with_stock = tmp_max_profit_with_stock; + } + return max(max_profit_with_stock, max_profit_without_stock); + } +}; diff --git a/122/step3.cpp b/122/step3.cpp new file mode 100644 index 0000000..46ecb3a --- /dev/null +++ b/122/step3.cpp @@ -0,0 +1,13 @@ +class Solution { +public: + int maxProfit(vector& prices) { + int max_profit = 0; + for (int i = 1; i < prices.size(); ++i) { + int profit = prices[i] - prices[i - 1]; + if (profit > 0) { + max_profit += profit; + } + } + return max_profit; + } +};