力扣:买卖股票的最佳时机 II(c++)

题目:

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。

设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。

注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。

解:

思路:

关键点是找出哪一天买进和哪一天卖出。

只有当下一天比今天的股价高,今天的才可买入,下一天的股价小于今天的,今天的才可卖出。又因为得先买入才可卖出,呈现出先上升后下降的趋势,进行一次买入和卖出的操作,取当次交易利润最大化。在将整个股价分成若干个这样的小组。将每次最大化利润相加,即为最大利润。下图中看出有两次先升后降的趋势,故进行两组买入卖出交易。

1:买1卖5    利润 5-1 = 4         

2:买3卖6    利润 6-3 = 3           

总利润:4+3 = 7

代码:

// 左:前一天    中:今天    右:下一天

int maxProfit(vector<int>& prices) {
    int i = 0;
    int sum = 0;   // 总利润
    if (prices.size() == 1 || prices.size() == 0)
        return 0;
    if (prices.size() == 2)
        return (prices[1] - prices[0]) > 0 ? prices[1] - prices[0] : 0;
    for (int j = 1;j < prices.size();j++)
    {
        if (prices[i] < prices[j] && j == prices.size() - 1)
        {
            sum = sum + prices[j] - prices[i];   // 中 - 左 
        }
        else if (prices[i] < prices[j] && prices[j + 1] < prices[j])  // 确定当前股  左< 中 > 右 买左,卖中
        {
            sum = sum + prices[j] - prices[i];   // 中 - 左 
            i = j + 1;   // i 跳到 右上,继续 左中右
            j = j + 1;   // j 跳到 此时 i 的中上            
        }
        else if (prices[i] >= prices[j])
            i = i + 1;
    }
    return sum;
}

 


版权声明:本文为L946494原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。