假设你有一个数组,其中第 i 个元素是一支给定股票第 i 天的价格。
如果您只能完成最多一笔交易(即买入和卖出一股股票),则设计一个算法来找到最大的利润。
示例 1:
输入: [7, 1, 5, 3, 6, 4] 输出: 5 最大利润 = 6-1 = 5(不是 7-1 = 6, 因为卖出价格需要大于买入价格)
示例 2:
输入: [7, 6, 4, 3, 1] 输出: 0 在这种情况下, 没有交易完成, 即最大利润为 0。
解题思路一(最好):
1.始终保存最小的买入价格
2.始终保存最大的利润
比如数据2,7,1,3
首先找到最小买入是2,然后做差7-2=5,保存利润,然后到最小买入变成1,此时利润还是5,然后到3,注意,这里就是核心了。
如果1后面出现的数字足够大,大到和1做差的值大于5,那么最大利润值就改变,否则,最大利润还是5.
这里暗含的逻辑是,后面的数如果减1的差肯定比减2的差来的大。
class Solution { public: int maxProfit(vector<int>& prices) { int result = 0; int buy = INT_MAX; for (int price : prices) { buy = min(buy, price); result = max(result, price - buy); } return result; } };
遍历找后 - 前差最大的。
class Solution { public: int maxProfit(vector<int>& prices) { vector<int> res; //其实就是找数组中的后序 - 前序的最大差值 if(prices.size() == 0) return 0; for(int i = 0;i < prices.size()-1;i++) { //找从i开始的最大值 int max = -1; for(int j = i+1;j < prices.size();j++) { if(prices[j] > max) { max = prices[j]; } } max = max - prices[i]; res.push_back(max); } int r; int max = -1000; for(int i = 0;i < res.size();i++) if(max < res[i]) max = res[i]; if(max < 0) return 0; else return max; } };