📅  最后修改于: 2023-12-03 14:58:21.472000             🧑  作者: Mango
这道题目是GATE计算机科学2021年的考题,考查的是编程的知识。该题目的难度为中等,需要考生具有一定的编程基础和算法思维。下面是该题目的相关介绍:
有一个数组arr
,其中元素为正整数。现在需要将其分成两个部分arr1
和arr2
,使得arr1
和arr2
的元素和相等。如果不存在这样的分割,返回-1
;否则,返回arr1
和arr2
的交集元素的个数。
函数签名:
def findNum(arr: List[int]) -> int:
pass
输入:
arr
,长度不超过$10^5$,其中每个元素为正整数,且大小不超过$10^6$输出:
arr
分成两个部分,返回-1
arr1
和arr2
的交集元素的个数输入:
arr = [2,3,4,3,2]
输出:
2
解释:
将arr
分成以下两部分:
arr1=[2,3,4]
,元素和为$9$arr2=[3,2]
,元素和为$5$两个部分的交集为$[2,3]$,共有$2$个元素。
from typing import List, Set
def findNum(arr: List[int]) -> int:
total = sum(arr)
if total % 2 == 1:
return -1
half = total // 2
s1 = set([0])
s2 = set([0])
for i in arr:
for j in list(s1):
t = j + i
if t <= half:
s2.add(t)
s1 = s2
s2 = set([0])
if half not in s1:
return -1
cnt = 0
common = s1 & s1
for i in common:
cnt += 1
return cnt
该题解使用哈希表求解,时间复杂度为$O(n \cdot \log_2 n)$,空间复杂度为$O(n)$。