LeetCode 1250. 检查「好数组」(set / 最大公约数)

文章目录

1. 题目

给你一个正整数数组 nums,你需要从中任选一些子集,然后将子集中每一个数乘以一个 任意整数,并求出他们的和。

假如该和结果为 1,那么原数组就是一个「好数组」,则返回 True;否则请返回 False。

示例 1:
输入:nums = [12,5,7,23]
输出:true
解释:挑选数字 575*3 + 7*(-2) = 1

示例 2:
输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 61029*1 + 6*(-3) + 10*(-1) = 1

示例 3:
输入:nums = [3,6]
输出:false
 
提示:
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^9

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/check-if-it-is-a-good-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 将数字插入 set, 反向遍历
  • 当前数对前一个数求模,模==1,返回 true
  • 模 != 1,将 模插入 set
class Solution {
    
    
public:
    bool isGoodArray(vector<int>& nums) {
    
    
        set<int> s(nums.begin(), nums.end());
        if(*s.begin()==1) return true;
        auto it = s.rbegin();
        int prev = *it, mod;
        for(it++; it != s.rend(); ++it)
        {
    
    
            if(*it == 0)
                break;
            mod = prev%*it;
            if(mod == 1)
                return true;
            else
                s.insert(mod);
            prev = *it;
        }
        return false;
    }
};

436 ms 44 MB

再看答案:裴蜀定理

  • 求所有数字的最大公约数,需要为1才可以
class Solution {
    
    
public:
    bool isGoodArray(vector<int>& nums) {
    
    
        int g = nums[0];
        for(int i = 1; i < nums.size(); ++i)
        {
    
    
            g = __gcd(g, nums[i]);
        }
        return g == 1;
    }
};
class Solution {
    
    
public:
    bool isGoodArray(vector<int>& nums) {
    
    
        int g = nums[0];
        for(int i = 1; i < nums.size(); ++i)
        {
    
    
            g = gcd(g, nums[i]);
        }
        return g == 1;
    }
    int gcd(int a, int b)
    {
    
    
        int r;
        while(b)
        {
    
    
            r = a%b;
            a = b;
            b = r;
        }
        return a;
    }
};

我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

猜你喜欢

转载自blog.csdn.net/qq_21201267/article/details/108960785