返回介绍

solution / 1200-1299 / 1250.Check If It Is a Good Array / README

发布于 2024-06-17 01:03:21 字数 2796 浏览 0 评论 0 收藏 0

1250. 检查「好数组」

English Version

题目描述

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

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

 

示例 1:

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

示例 2:

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

示例 3:

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

 

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9

解法

方法一:数学(裴蜀定理)

我们先可以考虑选取两个数的情况,若选取的数是 $a$ 和 $b$,那么根据题目的要求,我们需要满足 $a \times x + b \times y = 1$,其中 $x$ 和 $y$ 是任意整数。

根据裴蜀定理,可以得知,如果 $a$ 和 $b$ 互质,那么上述等式一定有解。实际上,裴蜀定理也可以推广到多个数的情况,即如果 $a_1, a_2, \cdots, a_i$ 互质,那么 $a_1 \times x_1 + a_2 \times x_2 + \cdots + a_i \times x_i = 1$ 一定有解,其中 $x_1, x_2, \cdots, x_i$ 是任意整数。

因此,我们只需要判断在数组 nums 中是否存在 $i$ 个互质的数即可。两个数互质的充要条件是它们的最大公约数为 $1$。如果数组 nums 存在 $i$ 个互质的数,那么数组 nums 中的所有数的最大公约数也为 $1$。

所以我们将题目转化为:判断数组 nums 中的所有数的最大公约数是否为 $1$。遍历数组 nums,求出数组 nums 中的所有数的最大公约数即可。

时间复杂度 $O(n + log m)$,空间复杂度 $O(1)$,其中 $n$ 是数组 nums 的长度,而 $m$ 是数组 nums 中的最大值。

class Solution:
  def isGoodArray(self, nums: List[int]) -> bool:
    return reduce(gcd, nums) == 1
class Solution {
  public boolean isGoodArray(int[] nums) {
    int g = 0;
    for (int x : nums) {
      g = gcd(x, g);
    }
    return g == 1;
  }

  private int gcd(int a, int b) {
    return b == 0 ? a : gcd(b, a % b);
  }
}
class Solution {
public:
  bool isGoodArray(vector<int>& nums) {
    int g = 0;
    for (int x : nums) {
      g = gcd(x, g);
    }
    return g == 1;
  }
};
func isGoodArray(nums []int) bool {
  g := 0
  for _, x := range nums {
    g = gcd(x, g)
  }
  return g == 1
}

func gcd(a, b int) int {
  if b == 0 {
    return a
  }
  return gcd(b, a%b)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文