买股票的最佳时机
(只能一次买入和卖出)
描述:
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
- 你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
- 如果不能获取到任何利润,请返回0
- 假设买入卖出均无手续费
- 假设输入[2,6,3,7,8,2],输出则为8-2 = 6。
【暴力枚举: 时间复杂度为O(n^2),空间复杂度是O(1) 】
class Solution{
public:
int maxProfit(vector<int>& prices){
int n = prices.size();
int ans = 0;
for(int i =0;i<n; i++){
for(int j =i+1; j<n; j++){
if(prices[j]> prices[i])
ans = max(ans,prices[j]-prices[i]);
}
}
// for(int i=0;i<len;i++){
// // 枚举股票买入的时间
// for(int j=0;j<i;j++){
// // 维护最大的收益
// ans=max(ans,prices[i]-prices[j]);
// }
return ans;
}
};
贪心算法: 时间复杂度就是O(n),空间复杂度也是O(1)
对于某一个天的股票的价格,假如我们在这天卖出,要想得到最大的收益,就需要在这一天前选择价格最低的一天买入,得到的差值就是我们的最大收益,然后维护一个最大值就行了。
class Solution{
public:
int maxProfit(vector<int>& prices){
int mi = 0x3f3f3f3f;
int ans =0;
for(auto x: prices){
mi = min(mi,x);
ans = max(ans, x-mi);
}
return ans;
}
};
(可以无限次买入和卖出)
描述:
假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
- 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票
- 如果不能获取收益,请返回0
- 假设买入卖出均无手续费
- 假设输入[2,6,3,7,8,2],输出则为4+(8-3)= 9
class Solution{
public:
int maxProfit(vector<int>& prices){
int n = prices.size();
int ans = 0;
for(int i = 1; i<n; i++){
if(prices[j]> prices[j-1]){
ans += prices[j]-prices[j-1];
}
}
return ans;
}
};
(只能交易两次,再次购买必须卖出之前的)
描述:
假设你有一个数组prices,长度为n,其中prices[i]是某只股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益
- 你最多可以对该股票有两笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
- 如果不能获取收益,请返回0
- 假设买入卖出均无手续费
- 输入:[8,9,3,5,1,3] 输出:4(5-3)+(3-1)
- 思想:用一个flag把区间分为两部分,找到两部分各自的谷(买入)和峰(卖出)。从0到n移动flag遍历数组。