题目:
给定一个数组,它的第 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。
解题思路:
用后一天减去前天得到隔天的利润,然后将该题目转化为求最大子序列和的问题。
class Solution { public: int maxProfit(vector<int>& prices) { vector<int> profit; int maxRes = 0; int sum = 0; for(int i = 1; i < prices.size(); ++i){ profit.push_back(prices[i]-prices[i-1]); } for(int i = 0;i < profit.size();++i){ sum += profit[i]; if(sum > 0){ maxRes = max(sum,maxRes); }else{ sum = 0; } } return maxRes; } };
另外一种解法,当天的价格减去今天以前的股票最小值:
class Solution { public: int maxProfit(vector<int>& prices) { vector<int> minleft(prices.size(),0); int res = 0; if(prices.size() <= 0){ return 0; } int minVal = INT_MAX; for(int i = 0;i < prices.size(); ++i){ minVal = min(minVal,prices[i]); minleft[i] = minVal; } for(int i = 1;i < prices.size(); ++i){ res = max(prices[i]-minleft[i-1],res); } return res; } };