K和数对的最大数目-LeetCode
1679. K 和数对的最大数目
🎯 问题描述(来源于LeetCode)
描述:
给你一个整数数组 nums 和一个整数 k。
在一步操作中,你可以选择数组中的两个数字,如果它们的和等于 k,就将它们从数组中移除。
请你返回你可以执行的最大操作数目。
说明:
-
这是一个哈希表计数结合贪心算法的问题。
-
核心逻辑是:对于每个数字
num,查找其互补数k - num是否存在。 -
如果存在,则配对成功,操作数加一,并减少互补数的计数。
-
如果不存在,则将当前数字加入哈希表,等待后续的互补数。
-
示例:
-
示例 1:
1 | 输入:nums = [1,2,3,4], k = 5 |
- 示例 2:
1 | 输入:nums = [3,1,3,4,3], k = 6 |
💻 解题思路
思路1:哈希表 + 贪心匹配
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是数组
nums的长度。 - 我们只遍历数组一次,每次哈希表操作(查找、插入、更新)的平均时间复杂度都是 。
- 总时间复杂度为 。
- 其中 是数组
- 空间复杂度:
- 哈希表
count在最坏情况下需要存储 个键值对。
- 哈希表
思考
-
贪心策略:
- 我们想要最大化操作数目,因此每当遇到一个数字
num,如果它的互补数k - num已经出现过(且未被完全配对),我们就立即进行配对。 - 这种“立即配对”的策略是贪心的,因为它不会错过任何可能的配对机会。
- 我们想要最大化操作数目,因此每当遇到一个数字
-
哈希表的作用:
- 哈希表用于记录尚未配对的数字及其出现次数。
- 键是数字本身,值是该数字的剩余数量。
-
逻辑流程:
- 遍历每个数字
num。 - 计算其互补数
complement = k - num。 - 检查
complement是否在哈希表中且数量大于 0:- 是:说明可以配对。操作数
ans加 1,complement的计数减 1(表示一个complement已被使用)。 - 否:说明当前无法配对。将
num的计数加 1(表示这个num等待后续的互补数)。
- 是:说明可以配对。操作数
- 遍历每个数字
-
处理重复数字:
- 代码通过
count[complement] > 0和count[complement] -= 1正确处理了重复数字的情况。 - 例如,
nums = [3,3,3], k = 6:- 第一个 3:
complement = 3,不在哈希表中,count[3] = 1。 - 第二个 3:
complement = 3,在哈希表中且count[3] = 1 > 0,配对成功,ans = 1,count[3] = 0。 - 第三个 3:
complement = 3,在哈希表中但count[3] = 0,不配对,count[3] = 1。
- 第一个 3:
- 最终结果为 1,正确。
- 代码通过
-
边界情况:
- 数组长度为 1:无法配对,返回 0。
- 所有数字都相同且
2 * num != k:无法配对,返回 0。 - 所有数字都相同且
2 * num == k:可以配对N // 2次。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






