https://leetcode.com/problems/check-if-it-is-a-good-array/description/
给定一个长 n n n数组 A A A,其数为 x 1 ∼ n x_{1\sim n} x1∼n,问是否 ∃ x 1 , x 2 , . . . , x k ∈ A , s . t . ∃ c 1 , . . . , c k ∈ Z , ∑ i = 1 k c i x i = 1 \exist x_1,x_2,...,x_k\in A, s.t. \exist c_1,...,c_k\in \mathbb{Z}, \sum_{i=1}^k c_ix_i=1 ∃x1,x2,...,xk∈A,s.t.∃c1,...,ck∈Z,∑i=1kcixi=1。
∃ c 1 , . . . , c k ∈ Z , ∑ i = 1 k c i x i = 1 \exist c_1,...,c_k\in \mathbb{Z}, \sum_{i=1}^k c_ix_i=1 ∃c1,...,ck∈Z,∑i=1kcixi=1等价于 gcd { x 1 , . . . , x k } = 1 \gcd\{x_1,...,x_k\}=1 gcd{x1,...,xk}=1,而其能推出 gcd { x 1 , . . . , x n } = 1 \gcd\{x_1,...,x_n\}=1 gcd{x1,...,xn}=1。如果 gcd { x 1 , . . . , x n } = 1 \gcd\{x_1,...,x_n\}=1 gcd{x1,...,xn}=1那显然满足条件。所以只需要 gcd { x 1 , . . . , x n } = 1 \gcd\{x_1,...,x_n\}=1 gcd{x1,...,xn}=1即可。求最大公约数可以用欧几里得算法。代码如下:
class Solution {
public:
bool isGoodArray(vector<int>& nums) {
int x = nums[0];
for (int a : nums) {
x = gcd(x, a);
if (x == 1) return true;
}
return false;
}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
};
时间复杂度 O ( ∑ i log A i ) O(\sum_i \log A_i) O(∑ilogAi),空间 O ( 1 ) O(1) O(1)。