LeetCode題解第122題

@zhouyu發表於2020-11-09

LeetCode第122題:

122題.買賣股票的最佳時機
1、思路:如果第二天的售價大於當天的售價則當天買入第二天賣出,這樣算的話可能出現當天賣出又買入的情況,所以不是實際的買入和賣出過程,僅僅是為了算出最大利潤而採用的方法。

class Solution {
    public int maxProfit(int[] prices) {
        int count = 0;
        for(int i = 0; i < prices.length - 1; i++){
            if(prices[i + 1] > prices[i]){ //如果有利可圖則進行買賣操作
                count += prices[i + 1] - prices[i];
            }
        }
        return count;
    }
}

2、思路:考慮每天結束時的兩種狀態,持有股票和不持有股票,而這兩種狀態到當天的最大利潤僅於前一天的兩種狀態的利潤有關。
1)在當天結束持有股票時,分為兩種情況,股票是當天買的,則此時利潤為前一天不持有股票的利潤去掉當天股票的價格,或者股票不是當前買的,則此時利潤為前一天持有股票的利潤,在二者選大的,則為當天結束持有股票的最大利潤
2)在當天結束不持有股票也分為兩種情況,股票是當天賣出的,則此時利潤為前一天持有股票的利潤加上當天股票的價格,或者股票不是當天賣出的,則此時利潤為前一天不持有股票的利潤,在二者選大的,則為當天結束不持有股票的最大利潤
可知,全部交易後,不持有股票的利潤肯定大於持有股票的利潤,則最後返回不持有股票的最大利潤即為答案

class Solution {
    public int maxProfit(int[] prices) {
        int none = 0;//定義初始狀態,不持有股票利潤為0
        int have = -prices[0];//持有股票利潤為負的第一天的售價
        for(int i = 1; i < prices.length; i++){
        	//利用臨時變數儲存當天兩種狀態可獲得的最大利潤
            int none1 = none > have + prices[i]?none:have+prices[i];
            int have1 = have > none - prices[i]?have:none - prices[i];
            none = none1;
            have = have1;
        }
        return none;

    }
}

相關文章