买卖股票的最佳时机
给定一个数组,它的第 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。
题解
一个简单的思路for双重循环 但会测试超时
int max_p=0;
int maxProfit(vector<int>& prices) {
for(int i=0;i<prices.size();i++){
for(int j=i;j<prices.size();j++){
if(prices[j]>prices[i])
max_p=max(prices[j]-prices[i],max_p);
}
}
return max_p;
}
想一想怎样才能减少检索的次数呢,于是想到,先找出vector里面最小的元素,这一天就是当天买进的日子,再从这以后的日期搜索会不会有最大的大于他的数字出现,如果有,两者之差就是最大利润,否则就没有最大利润,返回0
int max_p=0,min_p=10000,k;
int maxProfit(vector<int>& prices) {
for(int i=0;i<prices.size();i++){
if(prices[i]<min_p){
min_p=prices[i];
k=i;
}
}
for(int j=k+1;j<prices.size();j++){
max_p=max(prices[j]-prices[k],max_p);
}
return max_p;
}
但实际上这个思路不正确,从以下测试数据中体现出来错误点在哪里
输入:
[2,4,1]
输出
0
预期结果
2
也就是说min_price中记录的不应该是一整个vector中的最小值,而是当下搜索阶段中的最小值,因为在下一个最小值出现以前,当下最小值就有可能会产生一个不等于0的最大利润
正解
int maxProfit(vector<int>& prices) {
int inf = 1e9;
int min_p = inf, max_p = 0;
for (int price: prices) {
max_p = max(max_p, price - min_p);
min_p = min(price, min_p);
}
return max_p;
}
可是利用一维动态规划的方式效率并不高,后面有时间再看看其他题解学习一下。 买卖股票的最佳时机