[309] LeetCode、の凍結に株式を売買するための最良の時間

クールダウンして証券を売買するためのベストタイム

トピックレベル:中

件名の説明:

あなたがするアレイ持っていると言う番目の要素は、日に与えられた株式の価格である私を

最大の利益を発見するアルゴリズムを設計します。あなたが好きなよう、以下の制限で(すなわち、1つを購入し、株式1株を複数回販売)など、多くのトランザクションを完了可能性があります。

  • あなたは(あなたが再び購入する前に、すなわち、あなたが株式を売却しなければならない)、同時に複数の取引に従事することはできません。
  • あなたの株式を売却した後、あなたは次の日に株式を購入することはできません。(すなわち、クールダウン1日)

例:

Input: [1,2,3,0,2]
Output: 3 
Explanation: transactions = [buy, sell, cooldown, buy, sell]

  質問の意味:最初にその整数の配列、を考えると、私は番目の要素は最初表し、私が株価を-Day。最大の利益を計算するためのアルゴリズムを設計します。次の制約では、可能な限り多くのトランザクションを完了することができますが、2つの条件があります。もう一度購入する前に売却しなければならない、次の日には購入することができない販売した後、日に凍結されています。


問題解決のためのアイデア(動的計画法):

  彼は株式を取引を開始しました。

  以前、私たちは4つの話題の株式の売却を扱う回し:貿易制限k回の取引、かつて数多くの取引、取引倍でした。ここでは、凍結期間を加算し、数多くの例の変異体です。

  同じ問題解決方法または動的プログラミングは、トランザクションの数に制限はありませんので、我々は意思決定の各段階がこれです、毎日が舞台で、動的プログラミングのための状態をより便利に定義します、毎日購入、売却または凍結することを決定し、すべての二日目の状態:株式を保持して、手ではなく、株式の手(例凍結を含みます)。

  2つの状態変数を定義することが可能です。

  最大の利益は、私は例得られ、一日の終わりの後に株式の手ではありません表しています[i]は販売しています。

  開催[I]:私はまだ株式の手を保持し、一日の終わりの後場合に最大利得を示しています。

  (1):だから、まだ一日の終わり場合の株式を保持しているこの2つの状態のために、2つの可能性があります今日はちょうど買って、その後、凍結前日こと、およびそのの終わりに一日何の株式を手を動かしてはなりませんhold[i]=sell[i-2]-prices[i]。(2)あなたが購入し、今日は何も乾燥前に、すなわち、すでに購入していなかったにも一日の手の終了前に、他の言葉で、販売:hold[i]=hold[i-1]

  株式、2つの可能性が全く手がないことを一日の終わりの場合:(1)今日はちょうど販売:、それは彼の手がまだそう、株式を保持しているとき、一日の終わりの前に言うことであるsell[i]=hold[i-1]+prices[i]。(2)あなたが販売する前に、今日ドライ何も手が何の株式を持っていないときに、そう、一日の終わりの前にいることを説明しません:sell[i]=sell[i-1]

  まとめると、我々は漸化式を取得することができます。

    hold[i]=max(sell[i-2]-prices[i],hold[i-1])
    sell[i]=max(hold[i-1]+prices[i],sell[i-1])

  注意すべきもう一つのポイントはある:初期条件は、フリーズすることができない、売ることができない時間の最初の日は、初日は購入することにある、貪欲な考えは初日の反射をすることができます購入取引の無制限の数を扱うときに、購入されなければならないので、この貪欲な思考の正しさを証明していsell[0]=0ますが、hold[0]=-prices[0]

  最後に、上記の分析次のコード:

class Solution {
    public int maxProfit(int[] prices) {
        if(prices==null || prices.length==0)
            return 0;
        int len=prices.length;
        int[] sell=new int[len];
        int[] hold=new int[len];
        sell[0]=0;
        hold[0]=-prices[0];
        for(int i=1;i<len;i++){
            sell[i]=Math.max(sell[i-1],hold[i-1]+prices[i]);
            hold[i]=Math.max(hold[i-1],(i>1?sell[i-2]:0)-prices[i]); //这里i-2注意防止越界
        }
        return sell[len-1];
    }
}

  時間の複雑さ:O(n)は、空間的複雑:O(2N)

おすすめ

転載: www.cnblogs.com/gzshan/p/11122371.html