LeetCode.买股票的最佳时机(动态规划)

题目描述:来自LeetCode

方法一:暴力解(会超时)

思路:遍历数组,从第二天开始只要满足条件,我们都可以选择卖出, 而买入的时间自然可以是卖出前的任意一天,所以用一个变量来保存最小值,在遍历的时候,外层循环遍历数组更新可以获得的最大利润,内层循环用来更新第i天卖出,哪一天买入可以获得的最大值。

代码实现c++:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int maxp=0;//保存第j天卖出可以获得的最大利润
        int maxpr=0;//保存所有可以卖出的最大利润的最大利润
        for(int i=0;i<prices.size();i++){
            for(int j=i+1;j<prices.size();j++){
                if(prices[j]-prices[i]>0){//当卖出大于买入的时候,我们更新,不然小于零收益为0
                    maxp=max(maxp,prices[j]-prices[i]);
                }
             maxpr=max(maxpr,maxp);//更新每一次卖出可以获得的最大值的最大值
            }
        }
        return maxpr;
    }
};

方法二:动态规划

如何用O(N)的时间复杂度解决问题呢? 遍历一趟数组,还是一样,遍历到任意一个我们都假设在这一天卖出,那要让这一天卖出能获得最大利润就是让买入时花的钱最少呗,所以我们就求这一天之前,哪一天买入花的最少,很简单,我们每次遍历的时候都更新一下数组从0到第i-1的最小值就行了,这个最小值就是目前位置买入花的钱最少的,让第i天卖出的钱减去这个最小,一定是第i天卖出收益最大的,然后我们求出这个最大之后,要跟之前求出来的收益比较,即更新最大利润中的最大利润。

代码实现C++:

class Solution {
public:
    int maxProfit(vector<int>& prices) {   
        int minp=prices[0];//用来更新买入的最小值,从数组的第一个数开始
        int maxp=0;//用来更新所有能卖出的最大利润的最大利润
        for(int i=1;i<prices.size();i++){  
            maxp=max(maxp,prices[i]-minp);//更新这一天卖出所能获得的最大利润
            minp=min(minp,prices[i]);//用来更新买入的最小值
        }
        return maxp;
    }
};

今日刷题任务完成啦~如有错误欢迎指正

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值