2021 年 B 轮 Google kick start 的算法问题

问题描述

我正在使用 Python 解决 Google kick start 2021 Round B 中的最长进度问题

这是问题的链接https://codingcompetitions.withgoogle.com/kickstart/round/0000000000435a5b

我已经编写了以下代码,但似乎在测试用例中总是有错误的答案,就我而言,我已经尝试了所有情况,有人可以帮助我了解代码中的问题在哪里,谢谢!

def solution(A,N):
    i,j = 0,1
    ranges = {}
    res = 0
    left = {}
    right = {}
    while j < N:
        diff = A[j] - A[i]
        while j < N and A[j]-A[i] == (j-i)*diff:
            j += 1
        ranges[(i,j-1)] = diff
        left[i] = (i,j-1)
        right[j-1] = (i,j-1)
        if j <= N-1 or i > 0:
            res = max(res,j-i+1)
        else:
            res = max(res,j-i)
        i = j-1
    # check if two ranges can be merged
    for i in range(1,N-1):
        if i == 1:
            if i+1 in left:
                l1,r1 = left[i+1]
                if A[i+1]-A[i-1] == 2*ranges[left[i+1]]:
                    res = max(res,r1-l1+3)
        elif i == N-2:
            if i-1 in right:
                l1,r1 = right[i-1]
                if A[i + 1] - A[i - 1] == 2 * ranges[right[i - 1]]:
                    res = max(res,r1 - l1 + 3)
        else:
            if i+1 in left and i-1 in right and ranges[right[i-1]] == ranges[left[i+1]]:
                l1,r1 = right[i - 1]
                l2,r2 = left[i+1]
                if A[i+1]-A[i-1] == 2*ranges[left[i+1]]:
                    res = max(r1-l1+r2-l2+3,res)
    return res


if __name__ == "__main__":
    T = int(input().strip())
    for i in range(T):
        N = int(input().strip())
        A = list(map(int,input().strip().split(" ")))
        res = solution(A,N)
        print("Case #{}: {}".format(i+1,res))

解决方法

合并逻辑不正确。该代码仅尝试合并整个范围。在一个简单的失败案例中

1 2 3 6 5 4

它没有将 6 替换为 4 会产生 1 2 3 4 5