数位和相等数对的最大和-LeetCode
2342. 数位和相等数对的最大和
🎯 问题描述(来源于LeetCode)
描述:
给你一个下标从 0 开始的数组 nums ,数组中的元素都是 正 整数。
请你选出两个下标 i 和 j(i != j),且 nums[i] 的数位和 与 nums[j] 的数位和相等。
请你找出所有满足条件的下标 i 和 j ,找出并返回 nums[i] + nums[j] 可以得到的 最大值_。_如果不存在这样的下标对,返回 -1。
说明:
-
这是一个哈希表结合贪心算法的问题。
-
核心逻辑是将数字按照“数位和”进行分组。
-
对于同一个数位和组内的数字,为了使两数之和最大,我们只需要保留该组中最大的两个数(或者遍历时维护当前遇到的最大值)。
-
示例:
-
示例 1:
1 | 输入:nums = [18,43,36,13,7] |
- 示例 2:
1 | 输入:nums = [10,12,19,14] |
💻 解题思路
思路1:哈希表 + 贪心
思路1:代码实现
1 | class Solution: |
思路1:📊 性能分析
- 时间复杂度:
- 其中 是数组
nums的长度, 是数组中数字的最大值。 - 遍历数组需要 。
- 每次计算数位和
sum_bit需要 的时间(即数字的位数)。 - 哈希表操作平均为 。
- 总时间复杂度为 。
- 其中 是数组
- 空间复杂度:
- 哈希表
num_count在最坏情况下(所有数字数位和都不同)需要存储 个键值对。
- 哈希表
思考
-
数位和计算:
sum_bit函数通过取模% 10和整除// 10来逐位提取数字并求和。这是计算数位和的标准方法。
-
贪心策略:
- 我们要找的是和最大的数对。
- 对于具有相同数位和的一组数字,假设我们已经遍历了部分数字,并记录了其中的最大值
max_val。 - 当我们遇到一个新的数字
num(且数位和相同)时,num + max_val一定是当前能组成的最大和。 - 因此,哈希表中只需要存储每个数位和对应的最大数字。
- 代码中的
num_count[sum_c] = max(num_count[sum_c], num)正是体现了这一贪心思想。
-
逻辑流程:
- 遍历每个数字
num。 - 计算其数位和
sum_c。 - 检查
sum_c是否在哈希表中:- 存在:说明之前遇到过数位和相同的数字。计算
num + 历史最大值,更新全局答案ans。然后更新哈希表中的最大值为max(历史最大值, num)。 - 不存在:说明这是该数位和第一次出现,将
num存入哈希表。
- 存在:说明之前遇到过数位和相同的数字。计算
- 遍历每个数字
-
边界情况:
- 数组长度为 1:无法组成数对,
ans保持 -1,返回 -1。 - 所有数字数位和都不同:哈希表中每个键只对应一个值,
if sum_c in num_count始终为假(除了第一次),返回 -1。 - 有重复数字:逻辑依然正确,因为重复数字的数位和相同,且会被正确比较大小。
- 数组长度为 1:无法组成数对,
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






