LeetCode的股票问题
算法思想:这里只需要记录买股票的最低价格点,并且算一下如果我在例是最低价格买入,那么今天卖出能赚多少钱,一次遍历,取最大值即可。核心思想就是一次遍历找到最大利润和最小的价格。这里的时间复杂度是O(n)
class Solution {
public:
int maxProfit(vector<int>& prices) {
if(prices.size()==0) return 0;
int minPrice = prices[0];
int maxProfit = 0;
for(int i=1;i<prices.size();i++){
maxProfit = max(maxProfit,prices[i]-minPrice);
minPrice = min(prices[i],minPrice);
}
return maxProfit;
}
};
算法思想:这个题与上一个题的区别就是可以买卖多次股票,就是卖了还可以选个日子买进,接下来再卖。
这里在每次股票价格上涨的时候的差价都可以加入到我们最终的利润中来。时间复杂度是O(n)
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxProfit = 0;
if(prices.size()==0) return maxProfit;
for(int i=1;i<prices.size();i++){
if(prices[i]>prices[i-1])
maxProfit += prices[i]-prices[i-1];
}
return maxProfit;
}
};
算法思想:这个题与上一个问题的区别是这里可以最多完成两笔交易,因为是两笔交易就可以采用划分的思想来解题,假设从第一天到第i天是一段,从第i天到最后一天是一段,用两个变量f[i]和b[i]分别表示这两段时间内进行交易的最大利润值。这里采用DP的思想.
dp有两种转移,取最大值,第一种是第i天不卖f[i]=f[i-1],第二种是第i天卖f[i]=price[i]-minPrice。
f[i] = max(f[i-1],price[i]-minPrice)
b[i]中同样有两种,第一种是第i天不买入b[i]=b[i+1],第二种是第i天买入b[i]=maxPrice-price[i]
b[i] = max(b[i+1],maxPrice-price[i])
class Solution {
public:
int maxProfit(vector<int>& prices) {
int n = prices.size();
if(n==0) return 0;
vector<int> f(n);
vector<int> b(n);
int minPrice = prices[0];
for(int i=1;i<n;i++){
f[i] = max(f[i-1],prices[i]-minPrice);
minPrice = min(prices[i],minPrice);
}
int maxPrice = prices[n-1];
for(int i=n-2;i>=0;i--){
b[i] = max(b[i+1],maxPrice-prices[i]);
maxPrice = max(prices[i],maxPrice);
}
int res = 0;
for(int i=0;i<n-1;i++){
res = max(res,max(f[i]+b[i+1],f[i]));
}
res = max(res,f[n-1]);
return res;
}
};