买股票的最好时机

买股票的最佳时机

(只能一次买入和卖出)

描述:
假设你有一个数组prices,长度为n,其中prices[i]是股票在第i天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

  1. 你可以买入一次股票和卖出一次股票,并非每天都可以买入或卖出一次,总共只能买入和卖出一次,且买入必须在卖出的前面的某一天
  2. 如果不能获取到任何利润,请返回0
  3. 假设买入卖出均无手续费
  • 假设输入[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天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

  1. 你可以多次买卖该只股票,但是再次购买前必须卖出之前的股票
  2. 如果不能获取收益,请返回0
  3. 假设买入卖出均无手续费
  • 假设输入[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天的价格,请根据这个价格数组,返回买卖股票能获得的最大收益

  1. 你最多可以对该股票有两笔交易操作,一笔交易代表着一次买入与一次卖出,但是再次购买前必须卖出之前的股票
  2. 如果不能获取收益,请返回0
  3. 假设买入卖出均无手续费
  • 输入:[8,9,3,5,1,3] 输出:4(5-3)+(3-1)
  • 思想:用一个flag把区间分为两部分,找到两部分各自的谷(买入)和峰(卖出)。从0到n移动flag遍历数组。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值