假设你有一个数组,其中第 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;
}
};