You are working in a ball factory where you have n
balls numbered from lowLimit
up to highLimit
inclusive (i.e., n == highLimit - lowLimit + 1
), and an infinite number of boxes numbered from 1
to infinity
.
Your job at this factory is to put each ball in the box with a number equal to the sum of digits of the ball's number. For example, the ball number 321
will be put in the box number 3 + 2 + 1 = 6
and the ball number 10
will be put in the box number 1 + 0 = 1
.
Given two integers lowLimit
and highLimit
, return the number of balls in the box with the most balls.
Example 1:
Input: lowLimit = 1, highLimit = 10 Output: 2 Explanation: Box Number: 1 2 3 4 5 6 7 8 9 10 11 ... Ball Count: 2 1 1 1 1 1 1 1 1 0 0 ... Box 1 has the most number of balls with 2 balls.
Example 2:
Input: lowLimit = 5, highLimit = 15 Output: 2 Explanation: Box Number: 1 2 3 4 5 6 7 8 9 10 11 ... Ball Count: 1 1 1 1 2 2 1 1 1 0 0 ... Boxes 5 and 6 have the most number of balls with 2 balls in each.
Example 3:
Input: lowLimit = 19, highLimit = 28 Output: 2 Explanation: Box Number: 1 2 3 4 5 6 7 8 9 10 11 12 ... Ball Count: 0 1 1 1 1 1 1 1 1 2 0 0 ... Box 10 has the most number of balls with 2 balls.
Constraints:
1 <= lowLimit <= highLimit <= 105
You are given two integers lowLimit
and highLimit
. You have balls numbered from lowLimit
to highLimit
(inclusive). Each ball is placed in a box numbered according to the sum of its digits. Find the box with the maximum number of balls.
The most straightforward approach is to simulate the process. For each ball number between lowLimit
and highLimit
, we calculate the sum of its digits. We use an array (or a hash map) to count how many balls are in each box. Finally, we find the maximum count among all boxes.
Since the maximum sum of digits for a number less than or equal to 105 is 45 (99999 -> 45), we can use an array of size 46 to store the counts.
class Solution:
def countBalls(self, lowLimit: int, highLimit: int) -> int:
box_counts = [0] * 46 # Array to store counts for each box number
for i in range(lowLimit, highLimit + 1):
digit_sum = sum(int(digit) for digit in str(i))
box_counts[digit_sum] += 1
return max(box_counts)
import java.util.Arrays;
class Solution {
public int countBalls(int lowLimit, int highLimit) {
int[] boxCounts = new int[46]; // Array to store counts for each box number
for (int i = lowLimit; i <= highLimit; i++) {
int digitSum = 0;
int temp = i;
while (temp > 0) {
digitSum += temp % 10;
temp /= 10;
}
boxCounts[digitSum]++;
}
return Arrays.stream(boxCounts).max().getAsInt();
}
}
#include <vector>
#include <algorithm>
class Solution {
public:
int countBalls(int lowLimit, int highLimit) {
std::vector<int> boxCounts(46, 0); // Vector to store counts for each box number
for (int i = lowLimit; i <= highLimit; i++) {
int digitSum = 0;
int temp = i;
while (temp > 0) {
digitSum += temp % 10;
temp /= 10;
}
boxCounts[digitSum]++;
}
return *std::max_element(boxCounts.begin(), boxCounts.end());
}
};
Time Complexity: O(n * log10(m)), where n = highLimit
- lowLimit
+ 1 and m = highLimit
. The dominant operation is iterating through the numbers from lowLimit
to highLimit
and calculating the sum of digits for each. Calculating the sum of digits takes time proportional to the number of digits, which is approximately log10(m).
Space Complexity: O(1). The space used by the box_counts
array is constant because its size is fixed at 46 (or a small constant), regardless of the input values.