122.買賣股票的最佳時機 II

題目:

給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

示例:

示例 1:

輸入: [7,1,5,3,6,4]
輸出: 7
解釋: 在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6-3 = 3 。
示例 2:

輸入: [1,2,3,4,5]
輸出: 4
解釋: 在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4 。
注意你不能在第 1 天和第 2 天接連購買股票,之后再將它們賣出。
因為這樣屬于同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。
示例 3:

輸入: [7,6,4,3,1]
輸出: 0
解釋: 在這種情況下, 沒有交易完成, 所以最大利潤為 0。

思路:

股票購買策略

算法流程:

遍歷整個股票交易日價格列表 price,策略是所有上漲交易日都買賣(賺到所有利潤),所有下降交易日都不買賣(永不虧錢)。
設 profit為第 i-1 日買入與第 i 日賣出賺取的利潤,即 profit= prices[i] - prices[i - 1] ;
當該天利潤為正 profit> 0,則將利潤加入總利潤 profitMax;當利潤為 0 或為負,則直接跳過;
遍歷完成后,返回總利潤 profitMax。
復雜度分析:

時間復雜度 O(N) : 只需遍歷一次price;
空間復雜度 O(1) : 變量使用常數額外空間。

作者:jyd
鏈接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-ii/solution/best-time-to-buy-and-sell-stock-ii-zhuan-hua-fa-ji/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

2.貪心+雙指針
每次都盡可能的將股票賣出
只要是能賣出的,就判斷后面有沒有更高賣出的價格;
如果有,就以后面最高的價格賣出;
然后后面循環,只要能賣出的,都添加到自己的利潤里面

代碼:

class Solution {
    public int maxProfit(int[] prices) {
        
        int profitMax = 0;
        int profix = 0;
        for (int i = 1; i < prices.length; i++) {
            profix = prices[i] - prices[i-1];
            if (profix > 0) {
                profitMax += profix;
            }
        }
        return profitMax;
    }
}

//貪心+雙指針
class Solution {
    public int maxProfit(int[] prices) {
        //數組的長度
        int len = prices.length;
        //最大利潤
        int profix = 0;
        //指向買入的指針
        int pBuy = 0;
        //指向賣出的指針
        int pSell = 0;
        //循環直到賣出指針超過數組長度
        while (pSell < len && pBuy < len) {
            //保證買入的價格是小于賣出的價格
            if (prices[pBuy] > prices[pSell]) {
                pBuy ++;
                pSell = pBuy + 1;
            } else {
                //pSell + 1 < len:保證賣出的指針不會超出長度
                //判斷后面有沒有更高的價格可以賣出
                if (pSell + 1 < len && prices[pSell] < prices[pSell + 1]) {
                    pSell ++;
                } else {
                    //每次都將賣出的利潤加到總利潤中
                    profix += prices[pSell] - prices[pBuy];
                    pBuy = pSell + 1;
                    pSell = pBuy + 1;
                }
            }
        }
        //返回總利潤
        return profix;
    }
}

時間復雜度 O(N) : 只需遍歷一次price;
空間復雜度 O(1) : 變量使用常數額外空間。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容