贪心算法我一直相当苦手,股票买卖一系列问题算是一个不错的贪心算法的题目吧,一点一点解解看。
首先是系列第一题
假设有一个数组,它的第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将这些数去除,成功的将时间压进了及格线。