剑指 Offer 63. 股票的最大利润 & 121. 买卖股票的最佳时机

题目

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/gu-piao-de-zui-da-li-run-lcof
著作权归领扣网络所有。

假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?

示例 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。

限制:

0 <= 数组长度 <= 10^5

解答

在买卖股票时最大获益肯定是低买高买,故而用一个变量记录历史最低价格 minprice。
假设股票是在i天买的(i为最低价), 则minprice=prices[i];
那么在第j天卖出股票能得到的利润就是 prices[j] - minprice。

推演公式为:

profit[i] = max(profit[i-1], prices[i]-minprice)

示例1的过程 [7,1,5,3,6,4] 的动态规划过程:

iprices[i]minprices[i] - prices[min]profit[i]=max(profit[i-1], prices[i]-prices[min])
17000
21000
35244
44244
56255
64235

示例2的过程 [7,6,4,3,1] 的动态规划过程:

iprices[i]minprices[i] - prices[min]profit[i]=max(profit[i-1], prices[i]-prices[min])
17000
26000
34000
43000
51000

代码

时间复杂度为 O(n)
空间复杂度为 O(1)

int maxProfit(int* prices, int pricesSize){
    if ( prices == NULL || pricesSize == 0 ) { //检验输入的合理性
        return 0;
    }
    int min = prices[0];//定义变量min保存数组中的最小值
    int *dp = (int *)calloc( pricesSize, sizeof(int) ); //默认初始化都为0
    for( int i = 1; i < pricesSize; i++ ) { //从1开始遍历
        if( prices[i] < min ) { //保存数组中的最小值
            min = prices[i];
        } 
        //今日的最佳收益为昨天的最佳收益、今天股票价格减去在股票价格最低时买入价格这两者之间的最小值。
        dp[i] = dp[i-1] > (prices[i] - min) ? dp[i-1] : (prices[i] - min);
    }

    return dp[pricesSize-1];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值