leetcode:Best Time to Buy and Sell Stock III

之前刷題覺得沒什麼動力,因爲覺得找工作還那麼遠呢...但是因爲自己水平不咋地,現在不開始積累等到需要的時候就遲了,所以這個星期又開始努力刷題...

這一個星期刷的題比我之前幾個月做的加起來都多,但是都沒有寫博客,這星期接下來的工作就是把題目整理一下吧。前段時間也做了一些題,但是挺多都沒有自己的想法,參考了網上的答案,所以就沒有寫到博客上來。今天翻看之前的博客時,看到自己有記錄完全靠自己做出一道題的開心,其實今天也有這樣的心情,我覺得收穫還是挺多的,所以決定以後還是把做過的題記錄到博客上來,一來,不會做的題我可以做個筆記,二來,我自己做出來的題會讓我比較有成就感,比較有動力去做後面的題目。

順便,今天leetcode做了50題了,1/3了呢~還是有點小激動的哇~~

Say you have an array for which the ith element is the price of a given stock on day i.

Design an algorithm to find the maximum profit. You may complete at most two transactions.

Note:
You may not engage in multiple transactions at the same time (ie, you must sell the stock before you buy again).

Hide Tags
 Array Dynamic Programming


題目地址:https://oj.leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/

這裏要求出買賣股票的最大收益,而且你最多可以買兩次股票

後面有一道題也是要求最大收益,區別是你最多只可以進行一次交易

先考慮只進行一次交易的情況:

那就是找出數組中相差最大的兩個數,最簡單的方法是對於一個數計算所有它後面的數和它的差,然後所有差中最大的那個就是我們要求的,這時的時間複雜度是o(n^2).

這裏有一個O(N)的解法(參考了別人的答案)。我們可以遍歷一次數據,用min來記錄遍歷過的所有元素中的最小值,用max記錄遍歷過的數據中的最大的profit。最後的max就是我們要的答案。

這是一次交易的情況。兩次交易的情況下,我們可以一次正面掃描數組求最大收益max1,一次從數組後面還是掃描求最大虧損(其實就是正面掃描情況下的最大收益)max2,max1+max2最大時就是我們要的答案。

代碼:

class Solution {
public:
    int maxProfit(vector<int> &prices) {
        //最多交易兩次
        //根據Best Time to Buy and Sell Stock這一題的思想,可以正面掃描一次數組求出在第i天之前能取得的最大收益
        //然後反向掃描一遍數組求出第i天之後能取得的最大收益
        //然後兩者之和的最大值就是我們的最大收益
        
        int len = prices.size();
        vector<int> profitB(len),profitA(len);
        
        //第一遍掃描,求出第i天之前的最大收益
        int min = INT_MAX,maxP = 0;
        for(int i = 0;i < prices.size();i++){
            min = prices[i] < min ? prices[i] : min;
            int p = prices[i] - min;
            maxP = p > maxP ? p : maxP;
            profitB[i] = maxP;
        }
        
        //第二遍掃描,求出第i天之後的最大收益
        //從第i天到第n天的最大收益,就是第n天到第i的最大虧損
        int maxPrice= INT_MIN;
        maxP = 0;
        for(int i = prices.size() - 1;i >= 0;i--){
            maxPrice = prices[i] > maxPrice ? prices[i] : maxPrice;
            int p = maxPrice - prices[i];
            maxP = p > maxP ? p : maxP;
            profitA[i] = maxP;
        }
        
        //第三遍掃描,求最大收益
        int max = 0,sum = 0;
        for(int i = 0;i < prices.size();i++){
            sum = profitB[i] + profitA[i];
            max = sum > max ? sum : max;
        }
        
        return max;
    }
};


發佈了47 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章