圆环切割

小易有n个数字排成一个环,你能否将它们分成连续的两个部分(即在环上必须连续),使得两部分的和相等?

输入描述:
第一行数据组数T,对于每组数据
第一行数字n,表示数字个数
接下来一行n个数,按顺序给出环上的数字。2<=n<=100000,1<=Ai<=109


输出描述:
对于每组数据,一行输出YES/NO

输入例子1:
1
6
1 2 3 4 5 6

输出例子1:
NO

输入例子2:
1
4
4 4 5 3

输出例子2:
YES

 

参考1:

双指针,直接法,复杂度高

m = int(input())
for _ in range(m):
    n = int(input())
    num = list(map(int,input().split()))
    s = sum(num)
    k = 0 #标记
    for i in range(n):
        re = 0
        j = 0
        for j in range(n-1-i):
            if sum(num[i:i+j+1]) == int(s/2):
                print("YES",end="\n")
                k = 1
                break
        if k == 1:
            break
    if k == 0:
        print("NO",end="\n")

您的代码已保存
运行超时:您的程序未能在规定时间内运行结束,请检查是否循环有错或算法复杂度过大。
case通过率为30.00%

 

参考2:

双指针

def fun(n,nums):
    # 如果为奇数肯定分不开两部分
    if sum(nums)%2 != 0:
        return 'NO'
     
    # 只遍历存不存在连续序列求和为总和一半的子序列
    # 双指针:i和j,i表示以不同的元素开头时存在的情况,j表示到第j个元素时的和
    target = sum(nums)/2
    j = 1 
    total = nums[0] 
    for i in range(0,n):
        while total < target:
            total += nums[j]
            j += 1
            if j == n:
                j = 0
        if total == target:
            return 'YES'
        total -= nums[i]
    return 'NO'
 
# 获取输入
t = int(input())
for i in range(t):
    n = int(input())
    nums = input().split()
    nums = [int(i) for i in nums]
    print(fun(n,nums))

您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例

posted @ 2020-08-09 23:01  Andy_George  阅读(429)  评论(0编辑  收藏  举报