之前刷題覺得沒什麼動力,因爲覺得找工作還那麼遠呢...但是因爲自己水平不咋地,現在不開始積累等到需要的時候就遲了,所以這個星期又開始努力刷題...
這一個星期刷的題比我之前幾個月做的加起來都多,但是都沒有寫博客,這星期接下來的工作就是把題目整理一下吧。前段時間也做了一些題,但是挺多都沒有自己的想法,參考了網上的答案,所以就沒有寫到博客上來。今天翻看之前的博客時,看到自己有記錄完全靠自己做出一道題的開心,其實今天也有這樣的心情,我覺得收穫還是挺多的,所以決定以後還是把做過的題記錄到博客上來,一來,不會做的題我可以做個筆記,二來,我自己做出來的題會讓我比較有成就感,比較有動力去做後面的題目。
順便,今天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).
題目地址: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;
}
};