码迷,mamicode.com
首页 > 其他好文 > 详细

121. Best Time to Buy and Sell Stock

时间:2020-04-06 00:26:55      阅读:84      评论:0      收藏:0      [点我收藏+]

标签:problems   str   选择   return   http   vector   etc   lin   example   

https://leetcode.com/problems/best-time-to-buy-and-sell-stock/

给定一个数组,其中数组的第 i 个元素表示第 i 天的股票价格,你可以选择在其中一天买股票,然后再后面的某一天卖掉股票,求最大收益。(股票必须要先买才能卖)这里只能买一次,也只能卖一次
------
Example 1:
Input: [7,1,5,3,6,4]
Output: 5
Explanation: Buy on day 2 (price = 1) and sell on day 5 (price = 6), profit = 6-1 = 5.
Not 7-1 = 6, as selling price needs to be larger than buying price.
----------------------
Example 2:
Input: [7,6,4,3,1]
Output: 0
Explanation: In this case, no transaction is done, i.e. max profit = 0.

分析

该题与 子数组的最大和 相似 https://leetcode.com/problems/maximum-subarray/ ,其解答参见 https://www.jianshu.com/p/98676b3baf2c

  • 子数组的最大和 是求 nums[i] + .... + nums[j] 的最大值
  • 而这里买股票和卖股票是求 num[j] - num[i] 的最大值,而
    nums[j] - nums[i] = (nums[j] - nums[j-1]) + (nums[j-1] - nums[j-2]) + ..... + (nums[i+1] - nums[i])
  • 所以可以将 子数组的最大和 中的nums[i] 替代为 nums[i+1] - nums[i]

maxhere 记录的是当前购买和卖出的利润,如果利润小于0,就要重新购买股票,即将maxhere置0;
同时用一个maxsofar记录每次购买和卖出的利润,取其最大值

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int maxhere = 0, maxsofar = 0;
        for (int i=1; i<prices.size(); ++i)
        {
            maxhere = (maxhere + prices[i]-prices[i-1])> 0?(maxhere + prices[i]-prices[i-1]):0;
            maxsofar = maxhere > maxsofar ? maxhere : maxsofar;
        }
        return maxsofar;
    }
};

121. Best Time to Buy and Sell Stock

标签:problems   str   选择   return   http   vector   etc   lin   example   

原文地址:https://www.cnblogs.com/qiulinzhang/p/12640004.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!