力扣:买卖股票的最佳时机 II(c++)
Posted 解忧杂活铺子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣:买卖股票的最佳时机 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;
}
以上是关于力扣:买卖股票的最佳时机 II(c++)的主要内容,如果未能解决你的问题,请参考以下文章