zoukankan      html  css  js  c++  java
  • [LeetCode 1250] Check If It Is a Good Array

    Given an array nums of positive integers. Your task is to select some subset of nums, multiply each element by an integer and add all these numbers. The array is said to be good if you can obtain a sum of 1 from the array by any possible subset and multiplicand.

    Return True if the array is good otherwise return False.

     

    Example 1:

    Input: nums = [12,5,7,23]
    Output: true
    Explanation: Pick numbers 5 and 7.
    5*3 + 7*(-2) = 1
    

    Example 2:

    Input: nums = [29,6,10]
    Output: true
    Explanation: Pick numbers 29, 6 and 10.
    29*1 + 6*(-3) + 10*(-1) = 1
    

    Example 3:

    Input: nums = [3,6]
    Output: false
    

     

    Constraints:

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

    This problem is an application of the Bezout's lemma: if gcd(A1, A2,...., An) = d, then there are integers X1, X2,..., Xn such that d = A1 * X1 + A2 * X2 + ... + An * Xn. d is the smallest positive integer of this form. Every number of this form is a multiple of d. This lemma is also a generalization of the extended euclid's algorithm: we can always get integer x and y such that a * x + b * y = gcd(a, b). 

    Applying the above lemma, we know that we just need to check if there exists two numbers X and Y that are coprime, gcd(X, Y) == 1. Here X and Y can be a single array number or a series of numbers' gcd. So we can just compute the entire array's gcd. If at any point the gcd becomes 1, we know that either we have a number of 1 or we have 2 co-prime numbers and we can find use these numbers to get a sum of 1 for sure.

    Euclid's GCD algorithms takes O(log(min(a, b))). So the runtime is O(N * log(min(a, b))). 

    class Solution {
        public boolean isGoodArray(int[] nums) {
            int g = nums[0];
            for(int i = 1; i < nums.length; i++) {
                g = gcd(g, nums[i]);
                if(g == 1) {
                    break;
                }
            }
            return g == 1;
        }
        private int gcd(int a, int b) {
            if(b == 0) {
                return a;
            }
            return gcd(b, a % b);
        }
    }
  • 相关阅读:
    在sql中日期转化
    SQL Server标准版企业版个人版区别
    Oracle 9i默认用户
    SQL Server和Oracle的常用函数对比
    Delphi6函数大全
    Oracle 不支持 TOP 关键字
    c#连接数据库
    VC6安装及打开工程文件问题的解决
    error C4430: 缺少类型说明符 假定为 int。注意: C++ 不支持默认 int
    VC++ dll导出类
  • 原文地址:https://www.cnblogs.com/lz87/p/13733316.html
Copyright © 2011-2022 走看看