题目来源:. - 力扣(LeetCode)
题目思路分析
题目:给定一个整数数组 prices,其中 prices[i] 表示某股票在第 i 天的价格。在每一天,你可以选择买入和/或卖出一股该股票。你在任何时候最多只能持有一股该股票。你可以多次买卖一支股票,但你在再次购买前必须先出售掉之前的股票。设计一个算法来计算你所能获取的最大利润。
思路分析:
-
贪心算法:这个问题可以通过贪心算法解决。贪心算法的核心思想是每一步都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。
-
局部最优解:在这个问题中,局部最优解就是在价格上涨的连续天数中,选择买入(在价格最低的那天)并卖出(在紧接着的价格最高的那天),然后重复这一过程。
-
无需记录买入和卖出的具体日期:因为我们假设可以多次买卖,并且每次买入后必须卖出才能再次买入,所以我们只需要关注价格差,而不需要记录具体的买入和卖出日期。
代码:
#include <vector>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int ans = 0; // 用于存储总的最大利润
for (int i = 0; i < prices.size() - 1; i++) { // 遍历价格数组,注意这里我们只遍历到倒数第二个元素
// 如果第二天的价格比第一天的价格高,那么我们就在这两天之间做一次交易(买入并卖出)
if (prices[i + 1] > prices[i]) {
ans += prices[i + 1] - prices[i]; // 累加每次交易的利润
}
}
return ans; // 返回总的最大利润
}
};
注释详解:
int ans = 0;:初始化总的最大利润为0。for (int i = 0; i < prices.size() - 1; i++):遍历价格数组,从第一天到最后一天的前一天(因为我们比较的是相邻两天的价格)。if (prices[i + 1] > prices[i]):如果第二天的价格比第一天的价格高,那么我们可以在这两天之间做一笔交易(即买入第一天,卖出第二天)。ans += prices[i + 1] - prices[i];:将这两天之间的利润累加到总的最大利润中。return ans;:返回计算出的总的最大利润。
知识点摘要
- 贪心算法:每一步都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法。
- 局部最优解:在求解某些复杂问题时,从局部最优解出发,通过逐步构造,最终得出全局最优解。
- 股票买卖问题:通过贪心策略,即只关注价格差来求解最大利润,而不需要记录买入和卖出的具体日期。
本文讨论了一个经典的股票买卖问题,通过贪心算法的思想,我们可以简化问题,只需关注价格差来求解最大利润。这种方法不需要记录买入和卖出的具体日期,大大减少了问题的复杂性。通过贪心策略,我们能够在遍历一遍价格数组后得出全局最优解,即最大利润。这个算法的时间复杂度为O(n),非常高效,适合处理大规模的数据集。希望这篇文章能帮助你更好地理解股票买卖问题的解法,并在实际应用中灵活运用。

1166

被折叠的 条评论
为什么被折叠?



