From 7e1c978a30f0a2d03fd682740eeaf2f5e74e69ca Mon Sep 17 00:00:00 2001 From: yanglbme Date: Sun, 5 Jan 2025 21:55:23 +0800 Subject: [PATCH] feat: add solutions to lc problem: No.3411 No.3411.Maximum Subarray With Equal Products --- .../README.md | 126 +++++++++++++++++- .../README_EN.md | 126 +++++++++++++++++- .../Solution.cpp | 30 +++++ .../Solution.go | 36 +++++ .../Solution.java | 40 ++++++ .../Solution.py | 16 +++ 6 files changed, 366 insertions(+), 8 deletions(-) create mode 100644 solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.cpp create mode 100644 solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.go create mode 100644 solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.java create mode 100644 solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.py diff --git a/solution/3400-3499/3411.Maximum Subarray With Equal Products/README.md b/solution/3400-3499/3411.Maximum Subarray With Equal Products/README.md index 137e15aeb6586..d541d7d3770ee 100644 --- a/solution/3400-3499/3411.Maximum Subarray With Equal Products/README.md +++ b/solution/3400-3499/3411.Maximum Subarray With Equal Products/README.md @@ -88,25 +88,143 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3411.Ma #### Python3 ```python - +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 ```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++ ```cpp - +class Solution { +public: + int maxLength(vector& 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 ```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 +} ``` diff --git a/solution/3400-3499/3411.Maximum Subarray With Equal Products/README_EN.md b/solution/3400-3499/3411.Maximum Subarray With Equal Products/README_EN.md index d7efcec116cbb..1b226e33be5c3 100644 --- a/solution/3400-3499/3411.Maximum Subarray With Equal Products/README_EN.md +++ b/solution/3400-3499/3411.Maximum Subarray With Equal Products/README_EN.md @@ -86,25 +86,143 @@ edit_url: https://github.com/doocs/leetcode/edit/main/solution/3400-3499/3411.Ma #### Python3 ```python - +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 ```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++ ```cpp - +class Solution { +public: + int maxLength(vector& 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 ```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 +} ``` diff --git a/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.cpp b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.cpp new file mode 100644 index 0000000000000..157110c523ad7 --- /dev/null +++ b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.cpp @@ -0,0 +1,30 @@ +class Solution { +public: + int maxLength(vector& 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; + } +}; diff --git a/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.go b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.go new file mode 100644 index 0000000000000..259a798ff836d --- /dev/null +++ b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.go @@ -0,0 +1,36 @@ +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 +} diff --git a/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.java b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.java new file mode 100644 index 0000000000000..c8873d7403c01 --- /dev/null +++ b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.java @@ -0,0 +1,40 @@ +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; + } +} diff --git a/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.py b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.py new file mode 100644 index 0000000000000..b3d4e36cae312 --- /dev/null +++ b/solution/3400-3499/3411.Maximum Subarray With Equal Products/Solution.py @@ -0,0 +1,16 @@ +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