给你一个下标从 0 开始的数组 nums
,数组中的元素都是 正 整数。请你选出两个下标 i
和 j
(i != j
),且 nums[i]
的数位和 与 nums[j]
的数位和相等。
请你找出所有满足条件的下标 i
和 j
,找出并返回 nums[i] + nums[j]
可以得到的 最大值 。
示例 1:
输入:nums = [18,43,36,13,7] 输出:54 解释:满足条件的数对 (i, j) 为: - (0, 2) ,两个数字的数位和都是 9 ,相加得到 18 + 36 = 54 。 - (1, 4) ,两个数字的数位和都是 7 ,相加得到 43 + 7 = 50 。 所以可以获得的最大和是 54 。
示例 2:
输入:nums = [10,12,19,14] 输出:-1 解释:不存在满足条件的数对,返回 -1 。
提示:
1 <= nums.length <=
1 <= nums[i] <=
方法:哈希表
看到这么恐怖的数量级,第一想法肯定是暴力行不通,那么就来试试哈希表
首先将数组nums中每个元素的数位和保存在一个新数组中:
for i in nums:
str_i = str(i)
res = 0
for digit in str_i:
res += int(digit)
sum_num.append(res)
这段代码的时间复杂度是O(n)
然后创建字典,key值为当前数位和,当字典中不存在该key值时,dic[key]为nums中的当前元素值,如果字典中存在key值,那么将新的nums元素值append到字典中:
for i in range(n):
key = sum_num[i]
if key not in dic:
dic[key] = [nums[i]]
else:
dic[key].append(nums[i])
最后遍历字典,找出key值对应的value有两个及以上,并且按照降序排列,找出最大和即可:
for key, numbers in dic.items():
if len(numbers) >= 2:
numbers.sort(reverse=True)
pair_sum = numbers[0] + numbers[1]
ans = max(ans, pair_sum)
完整代码:
class Solution:
def maximumSum(self, nums: List[int]) -> int:
sum_num = []
dic={}
n=len(nums)
ans=-1
for i in nums:
str_i = str(i)
res = 0
for digit in str_i:
res += int(digit)
sum_num.append(res)
for i in range(n):
key = sum_num[i]
if key not in dic:
dic[key] = [nums[i]]
else:
dic[key].append(nums[i])
for key, numbers in dic.items():
if len(numbers) >= 2:
numbers.sort(reverse=True)
pair_sum = numbers[0] + numbers[1]
ans = max(ans, pair_sum)
return ans
最后,看了灵佬的题解再次震撼我心,附上灵佬题解链接:
力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台