Welcome to Subscribe On Youtube

1399. Count Largest Group

Description

You are given an integer n.

Each number from 1 to n is grouped according to the sum of its digits.

Return the number of groups that have the largest size.

 

Example 1:

Input: n = 13
Output: 4
Explanation: There are 9 groups in total, they are grouped according sum of its digits of numbers from 1 to 13:
[1,10], [2,11], [3,12], [4,13], [5], [6], [7], [8], [9].
There are 4 groups with largest size.

Example 2:

Input: n = 2
Output: 2
Explanation: There are 2 groups [1], [2] of size 1.

 

Constraints:

  • 1 <= n <= 104

Solutions

Solution 1: Hash Table or Array

We note that the number does not exceed $10^4$, so the sum of the digits also does not exceed $9 \times 4 = 36$. Therefore, we can use a hash table or an array of length $40$, denoted as $cnt$, to count the number of each sum of digits, and use a variable $mx$ to represent the maximum count of the sum of digits.

We enumerate each number in $[1,..n]$, calculate its sum of digits $s$, then increment $cnt[s]$ by $1$. If $mx < cnt[s]$, we update $mx = cnt[s]$ and set $ans$ to $1$. If $mx = cnt[s]$, we increment $ans$ by $1$.

Finally, we return $ans$.

The time complexity is $O(n \times \log M)$, and the space complexity is $O(\log M)$. Where $n$ is the given number, and $M$ is the range of $n$.

  • class Solution {
        public int countLargestGroup(int n) {
            int[] cnt = new int[40];
            int ans = 0, mx = 0;
            for (int i = 1; i <= n; ++i) {
                int s = 0;
                for (int x = i; x > 0; x /= 10) {
                    s += x % 10;
                }
                ++cnt[s];
                if (mx < cnt[s]) {
                    mx = cnt[s];
                    ans = 1;
                } else if (mx == cnt[s]) {
                    ++ans;
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        int countLargestGroup(int n) {
            int cnt[40]{};
            int ans = 0, mx = 0;
            for (int i = 1; i <= n; ++i) {
                int s = 0;
                for (int x = i; x; x /= 10) {
                    s += x % 10;
                }
                ++cnt[s];
                if (mx < cnt[s]) {
                    mx = cnt[s];
                    ans = 1;
                } else if (mx == cnt[s]) {
                    ++ans;
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def countLargestGroup(self, n: int) -> int:
            cnt = Counter()
            ans = mx = 0
            for i in range(1, n + 1):
                s = 0
                while i:
                    s += i % 10
                    i //= 10
                cnt[s] += 1
                if mx < cnt[s]:
                    mx = cnt[s]
                    ans = 1
                elif mx == cnt[s]:
                    ans += 1
            return ans
    
    
  • func countLargestGroup(n int) (ans int) {
    	cnt := [40]int{}
    	mx := 0
    	for i := 1; i <= n; i++ {
    		s := 0
    		for x := i; x > 0; x /= 10 {
    			s += x % 10
    		}
    		cnt[s]++
    		if mx < cnt[s] {
    			mx = cnt[s]
    			ans = 1
    		} else if mx == cnt[s] {
    			ans++
    		}
    	}
    	return
    }
    
  • function countLargestGroup(n: number): number {
        const cnt: number[] = new Array(40).fill(0);
        let mx = 0;
        let ans = 0;
        for (let i = 1; i <= n; ++i) {
            let s = 0;
            for (let x = i; x; x = Math.floor(x / 10)) {
                s += x % 10;
            }
            ++cnt[s];
            if (mx < cnt[s]) {
                mx = cnt[s];
                ans = 1;
            } else if (mx === cnt[s]) {
                ++ans;
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions