LEETCODE 1399. Count Largest Group 解题思路分析

题目大意:

统计最大组的数目

给你一个整数 n 。请你先求出从 1 到 n 的每个整数 10 进制表示下的数位和(每一位上的数字相加),然后把数位和相等的数字放到同一个组中。

请你统计每个组中的数字数目,并返回数字数目并列最多的组有多少个。

示例 1:

输入:n = 13
输出:4
解释:总共有 9 个组,将 1 到 13 按数位求和后这些组分别是:
 [1,10],[2,11],[3,12],[4,13],[5],[6],[7],[8],[9]。总共有 4 个组拥有的数字并列最多。

示例 2:

输入:n = 2
输出:2
解释:总共有 2 个大小为 1 的组 [1],[2]。

示例 3:

输入:n = 15
输出:6

示例 4:

输入:n = 24
输出:5

提示:

  • 1 <= n <= 10^4

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=1399

解题思路分析:

  1. 循环一遍数组,计算出每个数字的数位和
  2. 使用HashMap,将数位和相同的数字分在一组,key为数位和,value为数位和为该值的数字个数
  3. 找出数字最多的组中数字个数maxCount
  4. 找出所有元素为maxCount的组的个数,返回该个数

关于求位数和的方法,我们在之前的文章中多次介绍过,你可以参照文章LEETCODE常用小知识点总结取得十进制数字上的每一位 的方法介绍,这里就不再啰嗦了。

另外本题有一处可以优化的地方,解题时,我们可以使用数组来替代HashMap,由于题目给出n的范围在10的4次方以内,因此最大数字不会超过1万,对于10000以内的数字,位数和最大的数字肯定是9999,它的位数和是36,因此我们定义一个长度为37(下标0-36)的数组来替代HashMap,数组下标代表位数和,数组的值为等于该位数和的数字个数。

实现代码:

public int countLargestGroup(int n) {
    int maxCount=0;
    int[] countArr = new int[37];
    for(int i=1;i<=n;i++){
        int num = i;
        int sum=0;
        while(num>0){
            sum+=num%10;
            num/=10;
        }
        countArr[sum]++;
        maxCount=Math.max(maxCount,countArr[sum]);
    }
    int res=0;
    for(int i=0;i<37;i++){
        if(countArr[i]==maxCount)res++;
    }
    return res;
}

本题解法执行时间为6ms。

Runtime: 6 ms, faster than 76.43% of Java online submissions for Count Largest Group.

Memory Usage: 38.5 MB, less than 100.00% of Java online submissions for Count Largest Group.

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-1399-count-largest-group-解题思路分析/
此条目发表在leetcode分类目录,贴了, , 标签。将固定链接加入收藏夹。

发表评论

您的电子邮箱地址不会被公开。