Problem Statement

Brute Force [TLE]
class Solution:
def maximumSum(self, nums: List[int]) -> int:
hash_map = defaultdict(list)
res = -1
def get_sum_digits(number):
ans = 0
while number > 0:
ans += (number % 10)
number //= 10
return ans
for num in nums:
sum_digits = get_sum_digits(num)
hash_map[sum_digits].append(num)
for _, numbers in hash_map.items():
if len(numbers) >= 2:
n = len(numbers)
for i in range(n - 1):
for j in range(i + 1, n):
res = max(res, numbers[i] + numbers[j])
return res
Improved Algorithm using SortedList
class Solution:
from sortedcontainers import SortedList
def maximumSum(self, nums: List[int]) -> int:
hash_map = defaultdict(SortedList)
res = -1
def get_sum_digits(number):
ans = 0
while number > 0:
ans += (number % 10)
number //= 10
return ans
for num in nums:
sum_digits = get_sum_digits(num)
hash_map[sum_digits].add(num)
for _, numbers in hash_map.items():
if len(numbers) >= 2:
res = max(res, numbers[-1] + numbers[-2])
return res
- time: O(n log n)
- space: O(n)
Editorial
Approach 1: Sorting
class Solution:
# Helper function to compute the sum of digits of a number
def calculate_digit_sum(self, num):
digit_sum = 0
while num > 0:
digit_sum += num % 10
num //= 10
return digit_sum
def maximumSum(self, nums):
digit_sum_pairs = []
# Store numbers with their digit sums as pairs
for number in nums:
digit_sum = self.calculate_digit_sum(number)
digit_sum_pairs.append((digit_sum, number))
# Sort based on digit sums, and if equal, by number value
digit_sum_pairs.sort()
max_pair_sum = -1
# Iterate through the sorted array to find the maximum sum of pairs
for index in range(1, len(digit_sum_pairs)):
current_digit_sum = digit_sum_pairs[index][0]
previous_digit_sum = digit_sum_pairs[index - 1][0]
# If two consecutive numbers have the same digit sum
if current_digit_sum == previous_digit_sum:
current_sum = (
digit_sum_pairs[index][1] + digit_sum_pairs[index - 1][1]
)
max_pair_sum = max(max_pair_sum, current_sum)
return max_pair_sum
- time: O(n log n)
- space: O(n)
Approach 2: Priority Queue
class Solution:
# Helper function to compute the sum of digits of a number
def calculate_digit_sum(self, num):
digit_sum = 0
while num > 0:
digit_sum += num % 10
num //= 10
return digit_sum
def maximumSum(self, nums):
# List to store a heap for each possible digit sum (0 to 81)
digit_sum_groups = [[] for _ in range(82)]
max_pair_sum = -1
# Group numbers by their digit sums, maintaining heap size of 2
for number in nums:
digit_sum = self.calculate_digit_sum(number)
heapq.heappush(digit_sum_groups[digit_sum], number)
# Keep only the top 2 largest numbers in the heap
if len(digit_sum_groups[digit_sum]) > 2:
heapq.heappop(
digit_sum_groups[digit_sum]
) # Remove the smallest element
# Traverse the list to find the maximum pair sum for each group
for min_heap in digit_sum_groups:
if len(min_heap) == 2:
first = heapq.heappop(min_heap)
second = heapq.heappop(min_heap)
max_pair_sum = max(max_pair_sum, first + second)
return max_pair_sum
- time: O(n log n)
- space: O(log m)