# 1250.检查“好数组”

## 问题描述
[1250.检查“好数组”](https://leetcode.cn/problems/check-if-it-is-a-good-array/)

## 解题思路
首先，要注意到，本题的要求，其实可以转化为数组中所有元素的最大公因数为1；

利用辗转相除法，将`nums[0]`和`nums[1]`求得的最大公因数`num`再与`nums[2]`求最大公因数作为新的`num`，如果到最后`num == 1`，返回`true`，否则返回`false`。

## 代码
```cpp
class Solution {
  public:
    bool isGoodArray(vector<int> &nums) {
        std::sort(nums.begin(), nums.end()); // 利用哈希表储存不为1的因子，然后遍历，如果最后哈希表为空，return true
        if (nums[0] == 1)
            return true;
        std::unordered_set<int> factor;
        int root = sqrt(nums[0]);
        for (int i = 2; i <= root; i++) {
            if (nums[0] % i == 0) {
                if (factor.empty()) {
                    factor.insert(i);
                    factor.insert(nums[0] / i);
                } else {
                    int flag = 0; // 为0说明factor里面没有它的因子
                    for (auto &num : factor) {
                        if (i % num == 0) {
                            flag = 1;
                            break;
                        }
                    }
                    if (flag == 0) {
                        factor.insert(i);
                        factor.insert(nums[0] / i);
                    }
                }
            }
        }
        if (factor.empty()) {
            factor.insert(nums[0]);
        }
        for (int i = 1; i < nums.size(); i++) {
            auto tmp = factor;
            for (auto &num : tmp) {
                if (nums[i] % num != 0) { // 不是公因子，就移除
                    factor.erase(num);
                }
            }
        }
        return factor.empty();
    }
};
```

```cpp
#include <vector>
using std::vector;
class Solution {
  public:
    int gcd(int a, int b) {
        // 其中b^=a,a^=b,b^=a相当于swap(a,b)
        while (b ^= (a ^= (b ^= (a %= b))))
            ;
        return a;
    }
    bool isGoodArray(vector<int> &nums) {
        if (nums.size() == 1)
            return nums[0] == 1;
        for (int i = 0; i < nums.size() - 1; i++) {
            int tmp = gcd(nums[i], nums[i + 1]);
            if (tmp == 1) // 最大公因数已经是1了
                return true;
            nums[i + 1] = tmp;
        }
        return true;
    }
};
```
