Skip to content

Latest commit

 

History

History
234 lines (186 loc) · 5.48 KB

File metadata and controls

234 lines (186 loc) · 5.48 KB
comments difficulty edit_url tags
true
简单
数组
数学
枚举
数论
滑动窗口

English Version

题目描述

给你一个由 正整数 组成的数组 nums

如果一个数组 arr 满足 prod(arr) == lcm(arr) * gcd(arr),则称其为 乘积等价数组 ,其中:

  • prod(arr) 表示 arr 中所有元素的乘积。
  • gcd(arr) 表示 arr 中所有元素的最大公因数 (GCD)。
  • lcm(arr) 表示 arr 中所有元素的最小公倍数 (LCM)。

返回数组 nums 的 最长 乘积等价 子数组 的长度。

 

示例 1:

输入: nums = [1,2,1,2,1,1,1]

输出: 5

解释: 

最长的乘积等价子数组是 [1, 2, 1, 1, 1],其中 prod([1, 2, 1, 1, 1]) = 2, gcd([1, 2, 1, 1, 1]) = 1,以及 lcm([1, 2, 1, 1, 1]) = 2

示例 2:

输入: nums = [2,3,4,5,6]

输出: 3

解释: 

最长的乘积等价子数组是 [3, 4, 5]

示例 3:

输入: nums = [1,2,3,1,4,5,1]

输出: 5

 

提示:

  • 2 <= nums.length <= 100
  • 1 <= nums[i] <= 10

解法

方法一

Python3

class Solution:
    def maxLength(self, nums: List[int]) -> int:
        n = len(nums)
        ans = 0
        max_p = lcm(*nums) * max(nums)
        for i in range(n):
            p, g, l = 1, 0, 1
            for j in range(i, n):
                p *= nums[j]
                g = gcd(g, nums[j])
                l = lcm(l, nums[j])
                if p == g * l:
                    ans = max(ans, j - i + 1)
                if p > max_p:
                    break
        return ans

Java

class Solution {
    public int maxLength(int[] nums) {
        int mx = 0, ml = 1;
        for (int x : nums) {
            mx = Math.max(mx, x);
            ml = lcm(ml, x);
        }
        int maxP = ml * mx;
        int n = nums.length;
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            int p = 1, g = 0, l = 1;
            for (int j = i; j < n; ++j) {
                p *= nums[j];
                g = gcd(g, nums[j]);
                l = lcm(l, nums[j]);
                if (p == g * l) {
                    ans = Math.max(ans, j - i + 1);
                }
                if (p > maxP) {
                    break;
                }
            }
        }
        return ans;
    }

    private int gcd(int a, int b) {
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
        }
        return a;
    }

    private int lcm(int a, int b) {
        return a / gcd(a, b) * b;
    }
}

C++

class Solution {
public:
    int maxLength(vector<int>& nums) {
        int mx = 0, ml = 1;
        for (int x : nums) {
            mx = max(mx, x);
            ml = lcm(ml, x);
        }

        long long maxP = (long long) ml * mx;
        int n = nums.size();
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            long long p = 1, g = 0, l = 1;
            for (int j = i; j < n; ++j) {
                p *= nums[j];
                g = gcd(g, nums[j]);
                l = lcm(l, nums[j]);

                if (p == g * l) {
                    ans = max(ans, j - i + 1);
                }
                if (p > maxP) {
                    break;
                }
            }
        }
        return ans;
    }
};

Go

func maxLength(nums []int) int {
	mx, ml := 0, 1
	for _, x := range nums {
		mx = max(mx, x)
		ml = lcm(ml, x)
	}
	maxP := ml * mx
	n := len(nums)
	ans := 0
	for i := 0; i < n; i++ {
		p, g, l := 1, 0, 1
		for j := i; j < n; j++ {
			p *= nums[j]
			g = gcd(g, nums[j])
			l = lcm(l, nums[j])
			if p == g*l {
				ans = max(ans, j-i+1)
			}
			if p > maxP {
				break
			}
		}
	}
	return ans
}

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

func lcm(a, b int) int {
	return a / gcd(a, b) * b
}