📜  门| GATE CS 2021 |套装2 |问题26(1)

📅  最后修改于: 2023-12-03 14:58:21.472000             🧑  作者: Mango

门| GATE CS 2021 |套装2 |问题26

这道题目是GATE计算机科学2021年的考题,考查的是编程的知识。该题目的难度为中等,需要考生具有一定的编程基础和算法思维。下面是该题目的相关介绍:

题目描述

有一个数组arr,其中元素为正整数。现在需要将其分成两个部分arr1arr2,使得arr1arr2的元素和相等。如果不存在这样的分割,返回-1;否则,返回arr1arr2的交集元素的个数。

函数签名:

def findNum(arr: List[int]) -> int:
    pass

输入:

  • 一个列表arr,长度不超过$10^5$,其中每个元素为正整数,且大小不超过$10^6$

输出:

  • 如果不能将arr分成两个部分,返回-1
  • 如果可以分割成两个和相等的部分,则返回arr1arr2的交集元素的个数
示例

输入:

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)$。