• [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);
        }
    }
  • 相关阅读:
    将字典或者数组转换成JSON数据或者字符串
    [翻译] VICMAImageView
    [翻译] TransitionKit
    [翻译] UIGlossyButton
    [翻译] MMMaterialDesignSpinner
    [翻译] AFSoundManager
    实现UIView的无限旋转动画(非CALayer动画)
    【转】Winform 去掉 最大化 最小化 关闭按钮(不是关闭按钮变灰)终极解决办法
    【转】C# winform 安装程序打包(自定义操作)
    【转】C#安装包(自动卸载低版本)
  • 原文地址:https://www.cnblogs.com/lz87/p/13733316.html
Copyright © 2020-2023  润新知