美文网首页算法LeetCode
1819-序列中不同最大公约数的数目

1819-序列中不同最大公约数的数目

作者: 华雨欣 | 来源:发表于2021-04-04 16:08 被阅读0次

写在前面

这次周赛的第四题还是比较有意思的,尤其是时间复杂度方面,给的数据范围在10^5,需要O(NlogN)的算法,就很容易将思想局限在二分、排序、堆、并查集,这些方法之中,而这道题复杂度的计算用到级数的概念,表面接近O(N ^ 2)的算法,实际复杂度为O(NlogN),还是十分值得思考的一道题目。

题目

核心思路

这道题目使用暴力的解法显然是不行的,单单是枚举所有子序列都需要指数级别的时间复杂度,而题目需要的算法为O(NlogN),显然会超时。不过注意到给定数组中元素的大小范围限定在[1, 200000],给了这一限制,显然是一个突破口。
所以不如直接枚举 元素的值i ∈ [1, 200000],为了得到结果,就需要判断当前元素i是否能作为某一个子序列的最大公约数。如果可以的话,这个子序列中的元素必然都能被i整除,例如:i, 2i, 4i, 5i, 9i,那么就可以枚举i, 2i, 3i, 4i, ...并判断其是否在数组中,然后将其加入到一个可能的子序列里,并求得这个子序列的最大公约数curGcd,如果curGcd == i的话,就代表枚举到的i是满足的,将答案加一即可。
这里需要承认的一个事实是:如果存在一个子序列a, b, c的最大公约数为i,那么新加入一个元素x,整个序列a, b, c, x的最大公约数应该为gcd(i, x)
有了这个事实,在求子序列的最大公约数时就可以每添加一个元素求解一次curGcd,然后判断是否为目标值i即可,不需要维护这个枚举的子序列了。

完整代码

class Solution {

    public int gcd(int a, int b){
        return a % b == 0 ? b : gcd(b, a % b);
    }

    public int countDifferentSubsequenceGCDs(int[] nums) {
        boolean[] mark = new boolean[200001];
        int maxNum = 0;
        for(int num : nums) mark[num] = true;

        int res = 0;
        for(int i = 1; i < 200001; i++){
            int curGcd = 0;
            for(int j = i; j < 200001; j += i){
                if(mark[j]){
                    if(curGcd == 0) curGcd = j;
                    else curGcd = gcd(curGcd, j);
                    if(curGcd == i){
                        res++;
                        break;
                    }
                }
            }
        }
        return res;
    }
}

代码也不难,就是根据上边的思路维护一个结果res和当前子序列的最大公约数curGcd即可。比较难理解的就是算法的时间复杂度的计算了,看似时间为O(N ^ 2),不过实际的复杂度应该为O(NlogN),这里的N为数组元素的最大值,代码为了简洁取了数据范围峰值,具体计算方法如下:


通过上述公式计算,总的时间复杂度应该为O(m * logm),m代表数组元素的最大值,是满足题目要求的。

相关文章

  • 1819-序列中不同最大公约数的数目

    写在前面 这次周赛的第四题还是比较有意思的,尤其是时间复杂度方面,给的数据范围在10^5,需要O(NlogN)的算...

  • 1819. 序列中不同最大公约数的数目

    1819. 序列中不同最大公约数的数目[https://leetcode-cn.com/problems/numb...

  • 1819. 序列中不同最大公约数的数目

    题目: 给你一个由正整数组成的数组 nums 。 数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整...

  • 代码刷题

    1.输入两个正整数,求其最大公约数。 2.最大间隔:给定一个递增序列,a1

  • 算法笔记(7)| 数学问题(1)

    1.最大公约数与最小公倍数 1.最大公约数 最大公约数是指正整数a和b中都能够除尽的最大的数。解决最大公约数是方法...

  • 不同序列dp

    1987. 不同的好子序列数目[https://leetcode-cn.com/problems/number-o...

  • 最大公约数

    最大公约数 自然数d同时是a,b的约数,称d是a和b的公约数,d是a和b的公约数中最大的一个,d就是最大公约数,记...

  • 1071.字符串的最大公因子

    解题思路 定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest ...

  • 最大公约数

    一、辗转相除法1,循环除 2,迭代除 扩展:a,b最小公倍数=(ab最大公约数^2)a/最大公约数b/最大公约数=...

  • 最大公约数和最小公倍数

    最大公约数 一般用gcd(a,b)来表示a和b的最大公约数,而求解最大公约数常用欧几里得算法(即辗转相除法) 如果...

网友评论

    本文标题:1819-序列中不同最大公约数的数目

    本文链接:https://www.haomeiwen.com/subject/iudlkltx.html