C++算法练习day71——122.买卖股票的最佳时机2

题目来源:. - 力扣(LeetCode)

题目思路分析

题目:给定一个整数数组 prices,其中 prices[i] 表示某股票在第 i 天的价格。在每一天,你可以选择买入和/或卖出一股该股票。你在任何时候最多只能持有一股该股票。你可以多次买卖一支股票,但你在再次购买前必须先出售掉之前的股票。设计一个算法来计算你所能获取的最大利润。

思路分析

  1. 贪心算法:这个问题可以通过贪心算法解决。贪心算法的核心思想是每一步都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是全局最好或最优的算法。

  2. 局部最优解:在这个问题中,局部最优解就是在价格上涨的连续天数中,选择买入(在价格最低的那天)并卖出(在紧接着的价格最高的那天),然后重复这一过程。

  3. 无需记录买入和卖出的具体日期:因为我们假设可以多次买卖,并且每次买入后必须卖出才能再次买入,所以我们只需要关注价格差,而不需要记录具体的买入和卖出日期。

代码:

#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;:返回计算出的总的最大利润。

知识点摘要

  1. 贪心算法:每一步都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法。
  2. 局部最优解:在求解某些复杂问题时,从局部最优解出发,通过逐步构造,最终得出全局最优解。
  3. 股票买卖问题:通过贪心策略,即只关注价格差来求解最大利润,而不需要记录买入和卖出的具体日期。

本文讨论了一个经典的股票买卖问题,通过贪心算法的思想,我们可以简化问题,只需关注价格差来求解最大利润。这种方法不需要记录买入和卖出的具体日期,大大减少了问题的复杂性。通过贪心策略,我们能够在遍历一遍价格数组后得出全局最优解,即最大利润。这个算法的时间复杂度为O(n),非常高效,适合处理大规模的数据集。希望这篇文章能帮助你更好地理解股票买卖问题的解法,并在实际应用中灵活运用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值