计数反转而无需重复两次

时间:2018-10-14 15:29:01

标签: python algorithm

可以找到问题here。 这是我尝试过的方法,但答案却不对。我的逻辑是这样。在任何时候,如果排序队列和状态队列中位置的差为负,则将差的绝对值加到混乱中。现在,如果我面临两个相应的正差,并且前一个位置的数字大于状态队列中的当前数字,则我将混乱加1。

def minimumBribes(q):
    truth = None
    old = 0
    chaos = 0
    for i in range(len(q)):
        diff = (i+1)-q[i]
        if diff < -2:
            print("Too chaotic")
            return

        if diff < 0 :
            chaos = chaos + abs(diff)
            truth = True
            continue
        else:
            if truth == True:
                truth = False
                old = q[i]
                continue
            if old > q[i]:
                chaos = chaos + 1


        old = q[i] 
    print(chaos)

2 个答案:

答案 0 :(得分:1)

通过比较无法计算线性时间的倒数。有一个理论约束。 https://cs.stackexchange.com/questions/74515/can-we-count-the-number-of-inversions-in-time-mathcalon

您可以使用Fenwick树(也称为二进制索引树)来解决它。此处描述了这个想法(https://www.geeksforgeeks.org/count-inversions-array-set-3-using-bit/)。

答案 1 :(得分:0)

如果我正确理解了问题,那么您要做的就是重复一次,如果值大于索引,则减去(值-(索引+ 1))。

这些差异的总和是贿赂的数量,如果个人差异大于2,则是“太混乱了”。

例如对于25134,(2-1)+(5-2)= 4,但是5-2 = 3,所以您只需输出“太混乱”