LintCode买卖股票的最佳时机

贪心算法我一直相当苦手,股票买卖一系列问题算是一个不错的贪心算法的题目吧,一点一点解解看。
首先是系列第一题

假设有一个数组,它的第i个元素是一支给定的股票在第i天的价格。如果你最多只允许完成一次交易(例如,一次买卖股票),设计一个算法来找出最大利润。

咋一看很简单吗,遍历数组找出最大值并传出就好了,结果第一版顺顺利利的TLE了,看来O(n)级别的复杂度不符合题目要求。
(PS:我看其他人都是O(n)复杂度都通过了,不知道为什么我这个通不过?难道是max方法太耗时间了?)

const maxProfit = function (prices) {
    var maxP = 0;
    for(var i = 0;i<prices.length;i++){
        var tempP = Math.max.apply(null,prices.slice(i+1)) - prices[i];
        maxP = Math.max(tempP,maxP);
    }
    return maxP;
}

然后我改了无数次主体的逻辑,发现都卡在了最后一条特别长的数据。
最后我没有给主体逻辑做了修改,而是将数据处理了一下,成功的减少了很多的时间

const maxProfit = function (prices) {
    var tempArr = JSON.parse(JSON.stringify(prices));
    if(tempArr.join()===tempArr.sort((a,b)=>b-a).join())
        return 0;
    var maxP = 0;
    prices = prices.filter((x,i)=>i==0||x!==prices[i-1])
    for(var i = 0;i<prices.length;i++){
        var tempP = Math.max.apply(null,prices.slice(i+1)) - prices[i];
        maxP = Math.max(tempP,maxP);
    }
    return maxP;
}

第一是判断整个数组是否是降序的,如果股票一直跌,那么怎么买卖都不会有赚头。
第二则是将连续的相同的数去除,这些数是没必要判断的,通过一个filter将这些数去除,成功的将时间压进了及格线。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容