i番目の要素prices[i]がi番目の日の特定の株式の価格を表す配列が与えられます。特定の日にのみ株式を購入し、将来の別の日に株式を売却することを選択できます。【LeetCodeHot100】

最もホットな質問100の質問121:

最初にコードを貼り付けます。

class Solution {
    public int maxProfit(int[] prices) {
        /**
        * 遍历数组找到历史价格最低点,再往后遍历,如果出现那一天价格比最低点高,说明有利润(差值)
        * 记录下这个利润,继续往后遍历,记录下最大利润,如果最低点后面无元素了,说明
        * 这笔交易里没有利润可赚。
        */
        //定义最低价格min,初始值为第一天的价格
        int min = prices[0];
        //定义最大差值diffence
        int diffence = 0;
        //for循环遍历,若有一天价格小于最低价格,则更新最低价格,若大于则求其利润,并维护最大利润
        for(int i = 0;i < prices.length;i++){
            if(prices[i] < min){
                min = prices[i];
            }else if(prices[i] - min > diffence){
                diffence = prices[i] - min;
            }
        }
        return diffence;
    }
}

シーンの再構築:

株価がわからず、最大の利益を得たいとしたら、最初に1日目の株を買い、株価が下がったら2日目まで待って、すぐに売って2日目の株を買い直します。3日目も下落が続く場合は、早速売り、3日目に買います。

3日目に在庫が増えたらすぐに売らず、手元に置いて待って見て、在庫が最大値になったら売って、最大値を出すことができます利益。4日目も在庫が増え続けているので、明日はどうなるか楽しみです。その結果、5日目に在庫が落ちました!2日目の株価より安い。終わった。後悔している。4日目に売ろうと思っていた。現時点では、2日目の株を売って1日目の株を買うしかない。 。5日間の在庫

6日目に在庫を調べたところ、4日目よりもはるかに高くなっていることがわかりました7日目は取引が許されないので、早く売らなくてはいけません。今日売れば最大の利益が得られるので、すぐに売って最大の利益を得ることができます。

アイデアの分析:

上記の実際の復元により、最初に初日の在庫を購入する必要があることがわかります。i日目の在庫が初日の在庫よりも少ない場合は、その日に在庫を再購入します。 、次に在庫が増えるかどうかを確認します。在庫が減少傾向にある場合は、利益がないことを意味します。在庫が増える場合は、まずその日に得られる利益を書き留めます( j日目)、次の株が上がるが上がる場合は、その日に最大の利益が得られることを示すために前の利益は必要ないので、最大の利益を得るためにその日に株を売ります。

おすすめ

転載: blog.csdn.net/weixin_56960711/article/details/123338866