状态转换次数的算法

状态转换次数的算法

题目:一个有n个整数元素的数组arr,当其中元素的大小顺序由小到大或或由大到小发生改变时,计数器加1,相同的元素保持不变。

如:[1, 2, 2, 1, 2, 2],“1,2“是从小到大,状态并没有改变过所以不计数,“2,2”也没发生变化,所以也不计数,“2,1”是从大到小,相对于初始的从“小到大”改变到从”大到小“,状态发生转换,所以计数器加1。后面的”1,2“从同样是从“大到小”转变成”小到大“,状态再次发生改变,所以计数器加1。所以这个数列一共发生了两次转变。输出结果:2

def func(arr):
    i=0
    lastVal=0
    result = 0
    while i<len(arr)-1:
        curVal=arr[i]-arr[i+1]
        result+=(1 if lastVal*curVal<0 else 0)
        if curVal!=0:
            lastVal=curVal
        i+=1
    return result

本程序比较简单,唯一难点是怎么处理初始状态,因为初始装可以是“从小到大”也可以是“从大到小”,还可以是“相等”,在队列中遇到“相等”的值,可以忽略它的状态。

我的思路是无论初始状态是什么样子的(递增或递减),在状态发生改变时,([i]-[i+1])([i+1]-[i+2])的乘积都会是负数,只要([i]-[i+1])不等于0就可以把,把这个状态归结为“上一次的状态”,因为等于0的时候是属于初始状态(没有上一次的状态)。

Comments are closed.