📜  门| GATE CS Mock 2018 |设置 2 |第 65 题(1)

📅  最后修改于: 2023-12-03 15:12:38.201000             🧑  作者: Mango

门| GATE CS Mock 2018 |设置 2 |第 65 题

题目描述

给定一个数组 arr 和一个整数 k,你需要找到两个不同的元素 arr[i]arr[j],使得 $i≠j$ 且 $arr[i]+arr[j]=k$。如果有多个组合,则输出相乘之后的最大值。

函数签名
def max_product(arr: List[int], k: int) -> int:
    pass
输入
  • 一个整数 $n$,表示数组的长度 $(2\leq n\leq10^6)$。
  • 一个包含 $n$ 个整数的数组,$arr_i$ 表示第 $i$ 个元素 $(1\leq arr_i\leq10^9)$。
  • 一个整数 $k$,表示要求的和 $(2\leq k\leq2\times10^9)$。
输出

输出一个整数,表示找到的二元组相乘之后的最大值。如果无法找到,则返回 -1

示例
assert max_product([1, 3, 5, 4, 2], 5) == 15
assert max_product([5, 8, 10, 13], 10) == -1
assert max_product([12, 7, 4, 32, 9, 10], 36) == 352
原题

Hackerearth

题解
思路

使用一个哈希表 $m$,遍历数组 $arr$,对于数组中的每个元素 $x$,判断 $k-x$ 是否存在于哈希表中,如果存在,则取出哈希表中对应的值与 $x$ 相乘,如果更大则更新结果。如果不存在,则将 $x$ 插入到哈希表中。

时间复杂度

对于一个长度为 $n$ 的数组,我们需要遍历一次数组,对每个元素在哈希表中查找或插入操作为 $O(1)$,所以总的时间复杂度为 $O(n)$。

空间复杂度

由于哈希表中存储了最多 $n$ 个元素,所以空间复杂度为 $O(n)$。

代码
from typing import List

def max_product(arr: List[int], k: int) -> int:
    if len(arr) < 2:
        return -1

    m = {}
    res = -1
    for x in arr:
        if k - x in m:
            prod = m[k-x] * x
            if prod > res:
                res = prod
        m[x] = x

    return res