2441. 与对应负数同时存在的最大正整数

🎯 问题描述(来源于LeetCode)

描述:
给你一个不包含任何零的整数数组 nums,找出自身与对应的负数都在数组中存在的最大正整数 k。
返回正整数 k,如果不存在这样的整数,返回 -1。

说明:

  • 这是一个哈希表查找问题。

  • 核心逻辑是遍历数组,对于每个数字,检查其相反数是否已经出现过。

  • 如果出现过,则更新最大值。

  • 示例:

  • 示例 1:

1
2
3
输入:nums = [-1,2,-3,3]
输出:3
解释:3 是唯一一个自身与对应的负数都在数组中存在的正整数。
  • 示例 2:
1
2
3
输入:nums = [-1,10,6,7,-7,1]
输出:7
解释:1 和 7 都满足条件,但 7 更大。

💻 解题思路

思路1:哈希表(一次遍历)

思路1:代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution:
def findMaxK(self, nums: List[int]) -> int:
# 哈希表,记录已经遍历过的数字
find = defaultdict(int)
ans = -1

# 遍历数组
for num in nums:
# 检查当前数字的相反数是否已经在哈希表中
if -num in find:
# 如果存在,说明找到了一个满足条件的数对
# 更新最大值为当前绝对值和原最大值的较大者
ans = max(ans, abs(num))

# 将当前数字加入哈希表
find[num] += 1

return ans

思路1:📊 性能分析

  • 时间复杂度:O(N)O(N)
    • 其中 NN 是数组 nums 的长度。
    • 我们只遍历数组一次,每次在哈希表中查找和插入操作的平均时间复杂度都是 O(1)O(1)。
    • 总时间复杂度为 O(N)O(N)。
  • 空间复杂度:O(N)O(N)
    • 哈希表 find 在最坏情况下需要存储 NN 个键值对。

思考

  1. 哈希表的作用:

    • 哈希表用于存储已经遍历过的数字。
    • 通过哈希表,我们可以快速查找是否存在一个数字,使得它与当前数字互为相反数。
  2. 查找逻辑:

    • 对于当前数字 num,我们检查 -num 是否已经在哈希表中。
    • 如果 -num 在哈希表中,说明我们找到了一个满足条件的数对。
    • 此时,abs(num) 就是一个候选答案,我们用它来更新最大值。
  3. 为什么不需要区分正负:

    • 代码中使用了 abs(num),这样无论当前数字是正还是负,都能正确计算其绝对值。
    • 例如,如果当前数字是 -3,且 3 已经在哈希表中,那么 abs(-3) = 3 就是一个候选答案。
    • 如果当前数字是 3,且 -3 已经在哈希表中,那么 abs(3) = 3 也是一个候选答案。
  4. 存储逻辑:

    • 在查找之后,我们将当前数字 num 存入哈希表。
    • 这样可以确保在后续遍历中,当前数字可以被其他数字找到。
  5. 边界情况:

    • 数组中没有满足条件的数对:ans 保持为 -1,返回 -1。
    • 数组中有多个满足条件的数对:ans 会不断更新为最大值。