zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Leetcode.1250 检查「好数组」

数组 检查
2023-09-14 09:01:26 时间

题目链接

Leetcode.1250 检查「好数组」 Rating : 1983

题目描述

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

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

示例 1:

输入:nums = [12,5,7,23]
输出:true
解释:挑选数字 5 和 7。
53 + 7(-2) = 1

示例 2:

输入:nums = [29,6,10]
输出:true
解释:挑选数字 29, 6 和 10。
291 + 6(-3) + 10*(-1) = 1

示例 3:

输入:nums = [3,6]
输出:false

提示:

  • 1 < = n u m s . l e n g t h < = 1 0 5 1 <= nums.length <= 10^5 1<=nums.length<=105
  • 1 < = n u m s [ i ] < = 1 0 9 1 <= nums[i] <= 10^9 1<=nums[i]<=109

分析:

解决本题需要学习下 裴蜀定理(Bézout’s identity)

多个整数之间的裴蜀定理

a 1 . . . . a n a_1....a_n a1....an n n n 个整数, d d d 是这个 n n n个数的最大公约数,那么就肯定存在 x 1 . . . . x n x_1....x_n x1....xn 使得 a 1 ∗ x 1 . . . a n ∗ x n = d a_1 * x_1...a_n * x_n = d a1x1...anxn=d

特殊的情况是,只要当 a 1 . . . a n a_1...a_n a1...an 中有存在两个或以上的数互质,那么就一定存在 x 1 , x 2 . . . x n x_1,x_2...x_n x1,x2...xn 使得 a 1 ∗ x 1 + a 2 ∗ x 2 . . . a n ∗ x n = 1 a_1 * x_1 + a_2 * x_2...a_n * x_n = 1 a1x1+a2x2...anxn=1

时间复杂度: O ( n l o g m ) O(nlogm) O(nlogm)

代码:

class Solution {
public:
    //求 a 和 b 的最大公约数
    int gcd(int a,int b){
        return b ? gcd(b,a%b) : a;
    }
    bool isGoodArray(vector<int>& nums) {
        int g = 0;
        for(auto x:nums){
            g = gcd(g,x);
            //g == 1 说明 nums 中一定存在两个数以上的互质
            if(g == 1) break;
        }

        return g == 1;
    }
};