欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

股票的最大利润

程序员文章站 2022-03-05 15:49:48
...

问题描述

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

如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。

注意:你不能在买入股票前卖出股票。

示例 1:

输入: [7,1,5,3,6,4]
输出: 5
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。
示例 2:

输入: [7,6,4,3,1]
输出: 0
解释: 在这种情况下, 没有交易完成, 所以最大利润为 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock

解析:

1  暴力求解
  两层循环,每走一天求一下当前天买的最大利润,然后舍小取大

但效率太低了

我们不妨换种思路,

我们想利润最大,肯定不想在股票下跌期间买卖,
最好是在股票价钱最低的时候买入,
但也存在个问题,之后出售利润也可能不理想。

其实这是一种权衡思想

在涨价前买,之后每一天获取当天抛出利润,与原先利润相比,舍小取大,最终就可以得到一个最大利润咯。

class Solution {
public:
int maxProfit(vector& prices) {
if(prices.size() ==0 )
return 0;

//获取最低成本
int buy  = 0;
int sell = 0;
int tmpEarn= 0;//暂时利润
int maxEarn =0;//最大利润

for(int i=0; i < prices.size(); ++i )
{
    if(prices[i] < prices[buy]) //降价中
        buy = i; //换今天买入
    
    //否则 (+不加else都行,)
    tmpEarn = prices[i] - prices[buy];//计算当前利润
    //判断是否大于之前的利润,大于就更新
    maxEarn = maxEarn  > tmpEarn ? maxEarn : tmpEarn;
}
    return maxEarn;  
}

};