数组中的最大数对和-LeetCode
2815.数组中的最大数对和
🎯 问题描述
描述:
给定一个整数数组 nums,找出两个下标 i 和 j(i < j),使得 nums[i] 和 nums[j] 的最大数位相同,并且 nums[i] + nums[j] 的值最大。
如果不存在这样的数对,返回 -1。
说明:
-
这是对“数位和”问题的变体。
-
分组依据从“数位之和”变成了“数位最大值”。
-
例如:
129的最大数位是9,901的最大数位也是9,它们可以配对。 -
示例:
-
示例 1:
1 | 输入:nums = [129, 901, 55, 34] |
💻 解题思路
思路1:哈希表 + 贪心
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是数组长度, 是数字的最大值。
- 计算
max(str(num))需要遍历数字的每一位,耗时 。 - 总时间复杂度为 。
- 空间复杂度:
- 哈希表的键是 0-9 的整数,最多只有 10 个键。
- 因此空间复杂度是常数级的。
思考
-
分组依据的变化:
- 之前的题目是按“数位和”分组,这里是按“最大数位”分组。
- 逻辑完全一致:只要分组键相同,就可以配对。
-
“枚举右,维护左”的体现:
- 枚举右:遍历当前的
num。 - 维护左:
count[pre]存储了左边(历史)所有最大数位为pre的数字中的最大值。 - 我们不需要存储所有历史数字,只需要存储最大的那个,因为我们要最大化
num + history。
- 枚举右:遍历当前的
-
边界情况:
- 单个数字:无法配对,返回 -1。
- 所有数字最大数位都不同:返回 -1。
- 负数处理:题目通常假设为正整数。如果有负数,
max(str(-12))会变成max(['-', '1', '2']),结果是'2'(字符比较),逻辑可能会出错。如果是正整数数组,该代码完全正确。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






