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);
        }
    }
  • 相关阅读:
    Python经典的算法题【多测师】
    百度流氓驱动bd0001.sys【多测师】
    github上的前端面试题
    利用H5 FormData 实现表单中多图上传(可带其他如String类型数据)
    border-color的深入理解
    一个好玩的小制作,以及在<a/>中的标签href="javascript:;"/href="javascript:void(0);"/href="javascript:"的用法
    css进行网站布局
    Mybatis中的<trim>标签应用
    css居中小技巧
    css布局模型
  • 原文地址:https://www.cnblogs.com/lz87/p/13733316.html
Copyright © 2011-2022 走看看