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)\)。

浙公网安备 33010602011771号