如何解决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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。