概述
In stock market, HH-index( historically highest ) of the current price isk means that current price it the highest price in the previousk days, but not the highest one in the previousk+1 days. Given the price of n days, please give an algorithm ofO(n) time complexity to calculate the HH-index of all days.
简要地说,就是求数组每个元素在以它为起始向前能作为最大值的区间。初看这道题很容易,O(n2)的方法是不言自明的,而且似乎有很大提升空间。想出这个O(n)的算法也只需要一点小机巧。
具体思路是,假设给定的数组是price[n],那么如果price[n] < price[n-1],HH[n] = 1;如果price[n] = price[n-1],HH[n] = HH[n-1] +1;如果price[n] > price[n-1],那么price[n]必然是HH[n-1]天内的最大值,但是不确定再之前的值,所以,只需要继续比较price[n]和price[n-HH[n-1]]的值就可以了(这一步比较关键!),然后可以重复这个过程。求HH[n]的过程用伪码来表示就是。
HH-CALCULATE
for i ←1 to n
do HH[i] ←1
if price[i] =price[i-1]
then HH[i] ←HH[i-1]
else if price[i] > price[i-1]
then j ←i-1
while j>0 andprice[i]>=price[j])
do HH[i]←HH[i] +HH[j]
j ← j-HH[j]
复杂度分析:我只做了简单的形象化分析。把一个数组看成起起伏伏的波峰和波谷,于是这个数组就是由上坡过程和下坡过程组成的。那么显然在下坡过程中的点的比较次数很明显,都只有一次,总次数也就是下坡的长度。在上坡过程中,如图所示,圆点表示比较次数。从7到11的这个紫色上坡过程先是越过了6的波峰,比较次数为3,然后从11开始的黄色上坡过程就不会再与6的值比较。整个上坡过程的比较次数比上坡长度多了1,是由于10这个点翻越6时多比较了一次。归纳起来上坡过程的比较次数加起来也不会超过上坡的长度两倍(最多每个上坡都要翻越一次前面的波峰)。综上,总的比较次数必然少于2N(?)。
From ——— LC专栏 alvin_flyingchaos
最后
以上就是老迟到樱桃为你收集整理的Historically Highest Index algorithm HH-index算法的全部内容,希望文章能够帮你解决Historically Highest Index algorithm HH-index算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复