LeetCode题解:121. Best Time to Buy and Sell Stock

题目链接:

121. Best Time to Buy and Sell Stock


题目描述:

Say you have an array for which the ith element is the price of a given stock on day i.
If you were only permitted to complete at most one transaction (ie, buy one and sell one share of the stock), design an algorithm to find the maximum profit.

有一个数组来存储一支股票每天的价格,例如第i天的股票价格为prices[i]。
现在我们至多做一次股票交易,最多买入一次,卖出一次,设计一个算法求我们买股票能得到的最大收益。


题目解释:

注意这个题目中的一句话:you were only permitted to complete at most one transaction 我们只能买卖一次,是不能买卖多次的,这样题目的难度就降低了很多。
很明显这个题目使用动态规划求解比较好,动态规划求解的关键之处在于递推公式的推导,我们使用一个数组maxp来存储第k天能得到的最大收益,那么第k天的递推公式由两部分组成:

  1. 第k天不买也不卖,收益跟k-1天的收益相同。
  2. 第k天卖出去了,此时要注意,第k天能卖,说明在k天之前这股票已经买过了,那么要追求最大效益的话,我们要在k天之前找一个最便宜的时候买入。此时我们要用一个变量min来记录前k-1天的最小值,并不断更新它。

到这我们就可以得到递推公式:

maxp[k] = (maxp[i-1] > (prices[i]-min) ? maxp[i-1] : (prices[i] - min));

有了递推公式,剩下的就是一些变量的初始化工作了:

  • maxp[0]要进行初始化,第一天肯定不能卖股票,只能买,所以第一天最大收益是0,即既不买入也不卖出。
  • min值我们给定prices[0],这是当前最小值。
  • 我们的循环从第1天开始计算。
  • 还要注意边界条件:例如给的价格数组为空的情况,此时我们直接输出0。

到这我们的阶梯思路已经分析完毕了,下面来看AC代码:


AC代码:

int maxProfit(int* prices, int pricesSize)
{
  int profit[pricesSize];
  //初始化第一天的股票收益,第一天最好的情况就是),没有收益
  profit[0] = 0;

  int min = prices[0];

  for(int i = 1; i < pricesSize; i++)
  {
    //递推公式:
    profit[i] = (profit[i - 1] > (prices[i] - min)) ? (profit[i - 1]) : (prices[i] - min);

    //查看当前股票价格是不是最低的
    if(prices[i] < min)
    {
      min = prices[i];
    }
  }
  return profit[pricesSize - 1];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值