LeetCode 5725 序列中不同最大公约数的数目

最大公约数子序列计数
这是一道关于计算数组所有非空子序列中不同最大公约数数量的数论问题。给定一个正整数数组,你需要遍历所有可能的子序列,并找到它们的最大公约数。示例展示了如何通过遍历并计算每个数的倍数来确定最大公约数,从而得出不同最大公约数的总数。算法的时间复杂度为O(nlogn)。

题目链接

给你一个由正整数组成的数组 nums 。

数字序列的 最大公约数 定义为序列中所有整数的共有约数中的最大整数。

例如,序列 [4,6,16] 的最大公约数是 2 。
数组的一个 子序列 本质是一个序列,可以通过删除数组中的某些元素(或者不删除)得到。

例如,[2,5,10] 是 [1,2,1,2,4,1,5,10] 的一个子序列。
计算并返回 nums 的所有 非空 子序列中 不同 最大公约数的 数目 。

示例 1:

在这里插入图片描述

输入:nums = [6,10,3]
输出:5
解释:上图显示了所有的非空子序列与各自的最大公约数。
不同的最大公约数为 6 、10 、3 、2 和 1 。

示例 2:

输入:nums = [5,15,40,5,6]
输出:7

数论题~
这道题目其实没有那么复杂,因为数据范围比较小,所以我们可以遍历 [ 1 , 200000 ] [1,200000] [1,200000] 内的所有数 i i i,对每个数找它在数组中出现的倍数 x 1 , x 2 , x 3 , ⋯   , x n x_1,x_2,x_3,\cdots,x_n x1,x2,x3,,xn,然后判断 g c d ( x 1 , x 2 , x 3 , ⋯   , x n ) = i gcd(x_1,x_2,x_3,\cdots,x_n)=i gcd(x1,x2,x3,,xn)=i 即可,复杂度 O ( n l o g n ) O(nlogn) O(nlogn),注意标记数组里的数时别用 m a p map map,否则会超时,AC代码如下:

class Solution {
    bool mp[200005];
public:
    int countDifferentSubsequenceGCDs(vector<int> &nums) {
        int ans = 0;
        for (auto i:nums) mp[i] = 1;
        for (int i = 1; i <= 200000; i++) {
            int gcd = -1;
            for (int j = i; j <= 200000; j += i) {
                if (mp[j]) {
                    if (gcd == -1) gcd = j;
                    else gcd = __gcd(gcd, j);
                }
            }
            if (gcd == i) ans++;
        }
        return ans;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

旺 崽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值