LeetCode121
给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4]
输出:5
解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。
注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。
示例 2:
输入:prices = [7,6,4,3,1]
输出:0
解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
提示:
1 <= prices.length <= 10^5
0 <= prices[i] <= 10^4
这是我一开始使用动态规划的做法,后来发现另一种的解法更简洁,在下文也会发一下
代码区:
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int dp[100005];//dp数组储存最大利润值
dp[0]=0;//先初始化为0
int minn=prices[0];//minn为最便宜的价格,先初始化为第一天的价格
for(int i=1;i<prices.size();++i)//
{
dp[i]=max(dp[i-1],prices[i]-minn);
//比较是前一天的利润大还是今天的价格减去最小价格大,将大值赋给dp[i]
minn=min(minn,prices[i]);//找到更小的价格就记录下来
}
//经过上面这个for循环之后dp[prices.size()-1]的值就是最大的利润值
return dp[prices.size()-1];
}
};
方法二,代码区:
class Solution {
public:
int maxProfit(vector<int>& prices)
{
int buy=INT_MIN;//先将buy设定为最小值,防止下面进行max比较的时候和负值出现问题
int sell=0;//一开始卖的利润为0
for(int i=0;i<prices.size();++i)//从第一个元素开始枚举
{
buy=max(buy,-prices[i]);
//有两种选择,一种是不买,一种是买,如果价格低于之前的buy值(因为buy是负的所以此处反
//成低于)就买,将花掉的钱减去
sell=max(sell,buy+prices[i]);//卖还是不卖,哪个利润大选哪个,卖的话就将当天价格卖
//出去减去买入的成本就是利润
}
return sell;//返回最后的最大利润
}
};
另外,剑指Offer 63题也是差不多的
假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?
示例 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。
限制:
0 <= 数组长度 <= 10^5
代码区:
和上面那个代码一模一样就可以
新手上路,有错请指正