题目描述
分析
一次遍历
描述
由于暴力枚举会超过时间复杂度,因此需要一个复杂度低于O(N^2)的算法,考虑到O(NlogN)或O(N),但是因为本题数组原本的顺序很关键,因此O(NlogN)对应的快排算法不奏效。于是就是O(N),也就是遍历一次数组,那么想到在顺序访问每一个元素时,都求出其在当天售出能达到的最大利润,并求出这些利润的最大值。而要求出这些理论,就需要知道每一天的历史最低价,而这是可以通过一个变量储存来线性实现的,因此O(N)的算法能够实现。
代码
int maxProfit(int* prices, int pricesSize){
int i;
int low = prices[0];
int profit = 0;
for(i=1;i<pricesSize;i++){
if(prices[i]-low>profit){
profit = prices[i]-low;
}
if(prices[i]<low){
low = prices[i];
}
}
return profit;
}
收获
O(N)算法
在考虑线性算法时,可以认为数组的元素是一个一个给出的。而对于每一个状态,都算出一个当前的最优解。而当前状态的最优解算法满足时间复杂度为O(1)时,就可实现总时间复杂度为O(N)的算法。