1250. 检查「好数组」

题目链接:1250. 检查「好数组」

方法:最大公约数gcd

裴蜀定理简介

(1)若 \(a,b\) 是整数,且 \(gcd(a,b)=d\),那么对于任意的整数 \(x,y\)\(ax + by\) 都一定是 \(d\) 的倍数,特别地,一定存在整数 \(x,y\),使 \(ax+by=d\) 成立。
(2)推论:\(a,b\) 互质gcd(a,b)=1的充分必要条件是存在整数 \(x,y\) 使 \(ax+by=1\)

解题思路

(1)对于本题来说,若数组 \(nums\)中,存在 \(gcd(x1, ..., xn)=1,n >= 2\),则原数组为好数组。又因为一旦数组中有子集的 \(gcd=1\),那么整个数组的 \(gcd=1\),两者为充分必要条件。
(2)问题转化:若数组 \(nums\) 中一旦有元素的 \(gcd=1\),则原数组为好数组,否则不是。

代码

class Solution {
public:
    bool isGoodArray(vector<int>& nums) {
        int n = nums.size() - 1, ans = 0;
        while (n >= 0) {
            ans = gcd(ans, nums[n -- ]);
            if (ans == 1) return true;
        }
        return false;
    }
};

复杂度分析

时间复杂度:\(O(n + logM)\)\(n\)\(nums\) 数组的长度,\(M=max(nums)\), 因为其中 \(ans\) 的值单调不增,所以总的 \(gcd\) 时间复杂度为 \(O(logM)\)。;
空间复杂度:\(O(1)\)

posted @ 2023-04-07 21:42  lixycc  阅读(36)  评论(0)    收藏  举报