给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。可以尽可能多的买卖股票,设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 1:
输入:[7,1,5,3,6,4] 输出:7 解释:在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出,最大利润 = 5-1 = 4 。在第 4 天(股票价格 = 3)的时候买入,在第 4 天(股票价格 = 6)的时候卖出,最大利润 = 6-3 = 3 .最终最大利润是4+3=7
局部最优解:收集每天的正利润,全局最优:求得最大利润
按照这个思路贪心算法
class Solution
{
public:
int maxprofit(vector<int>& prices)
{
int result = 0;
for (int i = 0; i < prices.size(); i++)
{
result += max((prices[i + 1] - prices[i]), 0); //收集每天得正利润
}
return result;
}
};
贪心的本质就是选取每一个阶段的最优解,从而达到全局最优
怎么通过局部最优得到全局最优是阶梯关键
还有一个题目
给定一个数组 prices
,它的第 i
个元素 prices[i]
表示一支给定股票第 i
天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0
。
示例 1:
输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
这个题目时没有说尽可能多的买卖股票,只能买进一次卖出一次,也就是要寻找最大差值,首先想到暴力求解,但是暴力的话容易超时
class Solution
{
public:
int maxProfit(vector<int>& prices)
{
int result = 0;
for (int i = 0; i < prices.size(); i++)
{
for (int j = i + 1; j < prices.size(); j++)
{
result = max(result, prices[j] - prices[i]);
}
}
return result;
}
};
这个时候两种方式,我们要寻找最大差值,找所有天数中股票价格的最小值,然后在最小值那一天买入,然后遍历看在哪一天卖出得到的利润最大
class Solution
{
public:
int maxProfit(vector<int>& prices)
{
int minprice = 1e9, maxprofit = 0;
for (int price:prices)
{
maxprofit = max(maxprofit, price - minprice); //寻找最大差值
minprice = min(minprice, price); //寻找最小的股票的那一天
}
}
};