LeetCode算法练习之买卖股票的最佳时机

这个题目其实在《算法导论》中有过描述,书中使用的是分治算法进行的求解。具体过程看书就可以了。提一点分治法的使用条件,由于问题看上去需要两个指针,而且确定一个“中心”之后求解就会非常简单,所以考虑分治法。

书中是伪代码,这里把真正的代码写一下。分治法在使用时比较麻烦,最麻烦的就是如何处理递归的终止条件,以防止死循环或者forkbomb。这里终止条件是lo>=hi-1,就是说,lo和hi之间必须间隔两个及以上的元素。(其实用hi-lo<=1可能更好理解)这个式子是怎么得到的,就要具体的分析下奇数或者偶数的情况,以及最终两个指针落在哪里,脑子里要有递归轨迹。一般都是取左不取右的原则来写,和数组循环差不多。

LeetCode中,甚至是实际应用中,需要使用递归解决问题时最好新建一个函数,这样确定变量递归写算法比较自由,而原来的函数则具有调用简单的优点。

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        return maxProfit(prices,0,prices.size());
    }
    int maxProfit(vector<int>& prices,int lo,int hi){//取左不取右
        if(lo>=hi-1) return 0;
        int mid=(lo+hi)/2;
        int minl=prices[lo];
        int maxr=prices[mid];
        int profit=0;
        for(int i=lo;i<mid;i++){
            if(minl>prices[i]) minl=prices[i];
        }
        for(int j=mid;j<hi;j++){
            if(maxr<prices[j]) maxr=prices[j];
        }
        if(minl<maxr) profit=maxr-minl;
        int lpro=maxProfit(prices,lo,mid);
        int rpro=maxProfit(prices,mid,hi);
        if(lpro>=rpro&&lpro>=profit) {return lpro;}
        else if(rpro>=lpro&&rpro>=profit) {return rpro;}
        else{return profit;}
    }
};

然而,这个方法只有24.55%的时间复杂度得分。说明存在最优的解法。而算法导论中也提到过此题存在更好的解决方案。 所以我们再进行思考。

想想我们实际的炒股过程,为了一次达到最大利润,我们必须在股票达到一个史低点的时候买入,当前最低点后的最高价时卖出,所以就用这个道理来解决这个问题,可以在线性时间内算出最大利润。可以理解为和“赌徒”问题一样的贪心算法

分数顺利的刷到了100%,其实这道题告诉我们,分析时间复杂度,我们就可以知道该使用哪种方法。比如对数时间复杂度一般与二分查找和分治算法相关,而常数时间复杂度就要考虑动态规划,贪心算法以及双指针法来进行优化。

最后曝光LeetCode坑人样例,你都没有股价让我买卖什么!

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值