圆环切割
小易有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))
您的代码已保存
答案正确:恭喜!您提交的程序通过了所有的测试用例