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);
        }
    }
  • 相关阅读:
    架构的本质
    gulp 在 angular 项目中的使用
    Ionic 安装部署
    REST API 基于ACCESS TOKEN 的权限解决方案
    ionic 运行过程中动态切换API服务器地址
    ionic 实现双击返回键退出应用功能
    TPS和QPS是什么,他们的区别是什么
    redis和mySql的数据同步的解析
    mySql的UDF是什么
    export导出.xls时,在火狐的情况下出现表名乱码的情况的解决方案
  • 原文地址:https://www.cnblogs.com/lz87/p/13733316.html
Copyright © 2011-2022 走看看