状态转换次数的算法
题目:一个有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的时候是属于初始状态(没有上一次的状态)。