Formatted question description: https://leetcode.ca/all/1742.html

1742. Maximum Number of Balls in a Box

Level

Easy

Description

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 <= 10^5

Solution

Since highLimit <= 10^5, the sum of digits of each number is at most 46. Create an array sums where sums[i] is the number of balls that have sum of digits equal to i. Loop over all numbers from lowLimit to highLimit. For each number, calculate the sum of digits and update the array. Finally, loop over the array and obtain the maximum count.

class Solution {
    public int countBalls(int lowLimit, int highLimit) {
        int[] sums = new int[50];
        for (int i = lowLimit; i <= highLimit; i++) {
            int sum = getSumOfDigits(i);
            sums[sum]++;
        }
        int maxCount = 0;
        for (int i = 0; i < 50; i++)
            maxCount = Math.max(maxCount, sums[i]);
        return maxCount;
    }

    public int getSumOfDigits(int num) {
        int sum = 0;
        while (num > 0) {
            sum += num % 10;
            num /= 10;
        }
        return sum;
    }
}

All Problems

All Solutions