From bb16aa28fa3026fc986c2169eb235f924c960560 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Mon, 31 Mar 2025 06:47:19 +0800 Subject: [PATCH] fix: update solutions to lc problem: No.2501 No.2501.Longest Square Streak in an Array --- .../README.md | 281 ++++++++---------- .../README_EN.md | 281 ++++++++---------- .../Solution.cpp | 10 +- .../Solution.go | 14 +- .../Solution.java | 11 +- .../Solution.js | 24 ++ .../Solution.py | 6 +- .../Solution.ts | 20 ++ .../Solution2.cpp | 18 +- .../Solution2.go | 8 +- .../Solution2.java | 14 +- .../Solution2.js | 31 +- .../Solution2.py | 4 +- .../Solution2.ts | 23 +- .../Solution3.js | 35 --- .../Solution3.ts | 35 --- 16 files changed, 384 insertions(+), 431 deletions(-) create mode 100644 solution/2500-2599/2501.Longest Square Streak in an Array/Solution.js create mode 100644 solution/2500-2599/2501.Longest Square Streak in an Array/Solution.ts delete mode 100644 solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.js delete mode 100644 solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.ts diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/README.md b/solution/2500-2599/2501.Longest Square Streak in an Array/README.md index a8ae88543abb9..a516a5d7e3ab0 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/README.md +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/README.md @@ -83,10 +83,10 @@ class Solution: def longestSquareStreak(self, nums: List[int]) -> int: s = set(nums) ans = -1 - for v in nums: + for x in nums: t = 0 - while v in s: - v *= v + while x in s: + x *= x t += 1 if t > 1: ans = max(ans, t) @@ -98,15 +98,14 @@ class Solution: ```java class Solution { public int longestSquareStreak(int[] nums) { - Set s = new HashSet<>(); - for (int v : nums) { - s.add(v); + Set s = new HashSet<>(); + for (long x : nums) { + s.add(x); } int ans = -1; - for (int v : nums) { + for (long x : s) { int t = 0; - while (s.contains(v)) { - v *= v; + for (; s.contains(x); x *= x) { ++t; } if (t > 1) { @@ -126,14 +125,14 @@ public: int longestSquareStreak(vector& nums) { unordered_set s(nums.begin(), nums.end()); int ans = -1; - for (int& v : nums) { + for (long long x : nums) { int t = 0; - long long x = v; - while (s.count(x)) { - x *= x; + for (; s.contains(x); x *= x) { ++t; } - if (t > 1) ans = max(ans, t); + if (t > 1) { + ans = max(ans, t); + } } return ans; } @@ -145,24 +144,78 @@ public: ```go func longestSquareStreak(nums []int) int { s := map[int]bool{} - for _, v := range nums { - s[v] = true + for _, x := range nums { + s[x] = true } ans := -1 - for _, v := range nums { + for x := range s { t := 0 - for s[v] { - v *= v + for s[x] { + x *= x t++ } - if t > 1 && t > ans { - ans = t + if t > 1 { + ans = max(ans, t) } } return ans } ``` +#### TypeScript + +```ts +function longestSquareStreak(nums: number[]): number { + const s = new Set(nums); + let ans = -1; + + for (const num of nums) { + let x = num; + let t = 0; + + while (s.has(x)) { + x *= x; + t += 1; + } + + if (t > 1) { + ans = Math.max(ans, t); + } + } + + return ans; +} +``` + +#### JavaScript + +```js +/** + * @param {number[]} nums + * @return {number} + */ +var longestSquareStreak = function (nums) { + const s = new Set(nums); + let ans = -1; + + for (const num of nums) { + let x = num; + let t = 0; + + while (s.has(x)) { + x *= x; + t += 1; + } + + if (t > 1) { + ans = Math.max(ans, t); + } + } + + return ans; +}; +``` + @@ -190,13 +243,13 @@ func longestSquareStreak(nums []int) int { class Solution: def longestSquareStreak(self, nums: List[int]) -> int: @cache - def dfs(x): + def dfs(x: int) -> int: if x not in s: return 0 return 1 + dfs(x * x) s = set(nums) - ans = max(dfs(x) for x in nums) + ans = max(dfs(x) for x in s) return -1 if ans < 2 else ans ``` @@ -204,21 +257,21 @@ class Solution: ```java class Solution { - private Map f = new HashMap<>(); - private Set s = new HashSet<>(); + private Map f = new HashMap<>(); + private Set s = new HashSet<>(); public int longestSquareStreak(int[] nums) { - for (int v : nums) { - s.add(v); + for (long x : nums) { + s.add(x); } int ans = 0; - for (int v : nums) { - ans = Math.max(ans, dfs(v)); + for (long x : s) { + ans = Math.max(ans, dfs(x)); } return ans < 2 ? -1 : ans; } - private int dfs(int x) { + private int dfs(long x) { if (!s.contains(x)) { return 0; } @@ -240,16 +293,20 @@ public: int longestSquareStreak(vector& nums) { unordered_set s(nums.begin(), nums.end()); int ans = 0; - unordered_map f; - function dfs = [&](int x) -> int { - if (!s.count(x)) return 0; - if (f.count(x)) return f[x]; - long long t = 1ll * x * x; - if (t > INT_MAX) return 1; + unordered_map f; + auto dfs = [&](this auto&& dfs, long long x) -> int { + if (!s.contains(x)) { + return 0; + } + if (f.contains(x)) { + return f[x]; + } f[x] = 1 + dfs(x * x); return f[x]; }; - for (int& v : nums) ans = max(ans, dfs(v)); + for (long long x : s) { + ans = max(ans, dfs(x)); + } return ans < 2 ? -1 : ans; } }; @@ -260,8 +317,8 @@ public: ```go func longestSquareStreak(nums []int) (ans int) { s := map[int]bool{} - for _, v := range nums { - s[v] = true + for _, x := range nums { + s[x] = true } f := map[int]int{} var dfs func(int) int @@ -275,8 +332,8 @@ func longestSquareStreak(nums []int) (ans int) { f[x] = 1 + dfs(x*x) return f[x] } - for _, v := range nums { - if t := dfs(v); ans < t { + for x := range s { + if t := dfs(x); ans < t { ans = t } } @@ -291,18 +348,23 @@ func longestSquareStreak(nums []int) (ans int) { ```ts function longestSquareStreak(nums: number[]): number { - const set = new Set(nums); - const cache = new Map(); + const s = new Set(nums); + const f = new Map(); const dfs = (x: number): number => { - if (cache.has(x)) return cache.get(x)!; - if (!set.has(x)) return 0; - cache.set(x, 1 + dfs(x ** 2)); - return cache.get(x)!; + if (f.has(x)) { + return f.get(x)!; + } + if (!s.has(x)) { + return 0; + } + f.set(x, 1 + dfs(x ** 2)); + return f.get(x)!; }; - for (const x of set) dfs(x); - const ans = Math.max(...cache.values()); - + for (const x of s) { + dfs(x); + } + const ans = Math.max(...f.values()); return ans > 1 ? ans : -1; } ``` @@ -310,111 +372,30 @@ function longestSquareStreak(nums: number[]): number { #### JavaScript ```js -function longestSquareStreak(nums) { - const set = new Set(nums); - const cache = new Map(); +/** + * @param {number[]} nums + * @return {number} + */ +var longestSquareStreak = function (nums) { + const s = new Set(nums); + const f = new Map(); const dfs = x => { - if (cache.has(x)) return cache.get(x); - if (!set.has(x)) return 0; - cache.set(x, 1 + dfs(x ** 2)); - return cache.get(x); - }; - - for (const x of set) dfs(x); - const ans = Math.max(...cache.values()); - - return ans > 1 ? ans : -1; -} -``` - - - - - - - -### 方法三:计数 - - - -#### TypeScript - -```ts -function longestSquareStreak(nums: number[]): number { - const cnt: Record = {}; - const squares = new Set(); - - for (const x of new Set(nums)) { - cnt[x] = (cnt[x] ?? -1) + 1; - cnt[x ** 2] = (cnt[x ** 2] ?? -1) + 1; - } - - for (const key in cnt) { - const x = +key; - if (cnt[x] || cnt[x ** 2]) { - squares.add(x); - } - } - - if (squares.size <= 1) return -1; - - const iterator = squares[Symbol.iterator](); - let [max, c, x] = [0, 0, iterator.next().value]; - - while (x !== undefined) { - if (squares.has(x)) { - squares.delete(x); - x **= 2; - c++; - } else { - max = Math.max(max, c); - x = iterator.next().value; - c = 0; + if (f.has(x)) { + return f.get(x); } - } - - return max; -} -``` - -#### JavaScript - -```js -function longestSquareStreak(nums) { - const cnt = {}; - const squares = new Set(); - - for (const x of new Set(nums)) { - cnt[x] = (cnt[x] ?? -1) + 1; - cnt[x ** 2] = (cnt[x ** 2] ?? -1) + 1; - } - - for (const key in cnt) { - const x = +key; - if (cnt[x] || cnt[x ** 2]) { - squares.add(x); + if (!s.has(x)) { + return 0; } - } - - if (squares.size <= 1) return -1; - - const iterator = squares[Symbol.iterator](); - let [max, c, x] = [0, 0, iterator.next().value]; + f.set(x, 1 + dfs(x ** 2)); + return f.get(x); + }; - while (x !== undefined) { - if (squares.has(x)) { - squares.delete(x); - x **= 2; - c++; - } else { - max = Math.max(max, c); - x = iterator.next().value; - c = 0; - } + for (const x of s) { + dfs(x); } - - return max; -} + const ans = Math.max(...f.values()); + return ans > 1 ? ans : -1; +}; ``` diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/README_EN.md b/solution/2500-2599/2501.Longest Square Streak in an Array/README_EN.md index d09bbffa6e2d2..dfc402c089cb4 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/README_EN.md +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/README_EN.md @@ -83,10 +83,10 @@ class Solution: def longestSquareStreak(self, nums: List[int]) -> int: s = set(nums) ans = -1 - for v in nums: + for x in nums: t = 0 - while v in s: - v *= v + while x in s: + x *= x t += 1 if t > 1: ans = max(ans, t) @@ -98,15 +98,14 @@ class Solution: ```java class Solution { public int longestSquareStreak(int[] nums) { - Set s = new HashSet<>(); - for (int v : nums) { - s.add(v); + Set s = new HashSet<>(); + for (long x : nums) { + s.add(x); } int ans = -1; - for (int v : nums) { + for (long x : s) { int t = 0; - while (s.contains(v)) { - v *= v; + for (; s.contains(x); x *= x) { ++t; } if (t > 1) { @@ -126,14 +125,14 @@ public: int longestSquareStreak(vector& nums) { unordered_set s(nums.begin(), nums.end()); int ans = -1; - for (int& v : nums) { + for (long long x : nums) { int t = 0; - long long x = v; - while (s.count(x)) { - x *= x; + for (; s.contains(x); x *= x) { ++t; } - if (t > 1) ans = max(ans, t); + if (t > 1) { + ans = max(ans, t); + } } return ans; } @@ -145,24 +144,78 @@ public: ```go func longestSquareStreak(nums []int) int { s := map[int]bool{} - for _, v := range nums { - s[v] = true + for _, x := range nums { + s[x] = true } ans := -1 - for _, v := range nums { + for x := range s { t := 0 - for s[v] { - v *= v + for s[x] { + x *= x t++ } - if t > 1 && t > ans { - ans = t + if t > 1 { + ans = max(ans, t) } } return ans } ``` +#### TypeScript + +```ts +function longestSquareStreak(nums: number[]): number { + const s = new Set(nums); + let ans = -1; + + for (const num of nums) { + let x = num; + let t = 0; + + while (s.has(x)) { + x *= x; + t += 1; + } + + if (t > 1) { + ans = Math.max(ans, t); + } + } + + return ans; +} +``` + +#### JavaScript + +```js +/** + * @param {number[]} nums + * @return {number} + */ +var longestSquareStreak = function (nums) { + const s = new Set(nums); + let ans = -1; + + for (const num of nums) { + let x = num; + let t = 0; + + while (s.has(x)) { + x *= x; + t += 1; + } + + if (t > 1) { + ans = Math.max(ans, t); + } + } + + return ans; +}; +``` + @@ -190,13 +243,13 @@ The time complexity is $O(n)$, and the space complexity is $O(n)$. Here, $n$ is class Solution: def longestSquareStreak(self, nums: List[int]) -> int: @cache - def dfs(x): + def dfs(x: int) -> int: if x not in s: return 0 return 1 + dfs(x * x) s = set(nums) - ans = max(dfs(x) for x in nums) + ans = max(dfs(x) for x in s) return -1 if ans < 2 else ans ``` @@ -204,21 +257,21 @@ class Solution: ```java class Solution { - private Map f = new HashMap<>(); - private Set s = new HashSet<>(); + private Map f = new HashMap<>(); + private Set s = new HashSet<>(); public int longestSquareStreak(int[] nums) { - for (int v : nums) { - s.add(v); + for (long x : nums) { + s.add(x); } int ans = 0; - for (int v : nums) { - ans = Math.max(ans, dfs(v)); + for (long x : s) { + ans = Math.max(ans, dfs(x)); } return ans < 2 ? -1 : ans; } - private int dfs(int x) { + private int dfs(long x) { if (!s.contains(x)) { return 0; } @@ -240,16 +293,20 @@ public: int longestSquareStreak(vector& nums) { unordered_set s(nums.begin(), nums.end()); int ans = 0; - unordered_map f; - function dfs = [&](int x) -> int { - if (!s.count(x)) return 0; - if (f.count(x)) return f[x]; - long long t = 1ll * x * x; - if (t > INT_MAX) return 1; + unordered_map f; + auto dfs = [&](this auto&& dfs, long long x) -> int { + if (!s.contains(x)) { + return 0; + } + if (f.contains(x)) { + return f[x]; + } f[x] = 1 + dfs(x * x); return f[x]; }; - for (int& v : nums) ans = max(ans, dfs(v)); + for (long long x : s) { + ans = max(ans, dfs(x)); + } return ans < 2 ? -1 : ans; } }; @@ -260,8 +317,8 @@ public: ```go func longestSquareStreak(nums []int) (ans int) { s := map[int]bool{} - for _, v := range nums { - s[v] = true + for _, x := range nums { + s[x] = true } f := map[int]int{} var dfs func(int) int @@ -275,8 +332,8 @@ func longestSquareStreak(nums []int) (ans int) { f[x] = 1 + dfs(x*x) return f[x] } - for _, v := range nums { - if t := dfs(v); ans < t { + for x := range s { + if t := dfs(x); ans < t { ans = t } } @@ -291,18 +348,23 @@ func longestSquareStreak(nums []int) (ans int) { ```ts function longestSquareStreak(nums: number[]): number { - const set = new Set(nums); - const cache = new Map(); + const s = new Set(nums); + const f = new Map(); const dfs = (x: number): number => { - if (cache.has(x)) return cache.get(x)!; - if (!set.has(x)) return 0; - cache.set(x, 1 + dfs(x ** 2)); - return cache.get(x)!; + if (f.has(x)) { + return f.get(x)!; + } + if (!s.has(x)) { + return 0; + } + f.set(x, 1 + dfs(x ** 2)); + return f.get(x)!; }; - for (const x of set) dfs(x); - const ans = Math.max(...cache.values()); - + for (const x of s) { + dfs(x); + } + const ans = Math.max(...f.values()); return ans > 1 ? ans : -1; } ``` @@ -310,111 +372,30 @@ function longestSquareStreak(nums: number[]): number { #### JavaScript ```js -function longestSquareStreak(nums) { - const set = new Set(nums); - const cache = new Map(); +/** + * @param {number[]} nums + * @return {number} + */ +var longestSquareStreak = function (nums) { + const s = new Set(nums); + const f = new Map(); const dfs = x => { - if (cache.has(x)) return cache.get(x); - if (!set.has(x)) return 0; - cache.set(x, 1 + dfs(x ** 2)); - return cache.get(x); - }; - - for (const x of set) dfs(x); - const ans = Math.max(...cache.values()); - - return ans > 1 ? ans : -1; -} -``` - - - - - - - -### Solution 3: Counting - - - -#### TypeScript - -```ts -function longestSquareStreak(nums: number[]): number { - const cnt: Record = {}; - const squares = new Set(); - - for (const x of new Set(nums)) { - cnt[x] = (cnt[x] ?? -1) + 1; - cnt[x ** 2] = (cnt[x ** 2] ?? -1) + 1; - } - - for (const key in cnt) { - const x = +key; - if (cnt[x] || cnt[x ** 2]) { - squares.add(x); - } - } - - if (squares.size <= 1) return -1; - - const iterator = squares[Symbol.iterator](); - let [max, c, x] = [0, 0, iterator.next().value]; - - while (x !== undefined) { - if (squares.has(x)) { - squares.delete(x); - x **= 2; - c++; - } else { - max = Math.max(max, c); - x = iterator.next().value; - c = 0; + if (f.has(x)) { + return f.get(x); } - } - - return max; -} -``` - -#### JavaScript - -```js -function longestSquareStreak(nums) { - const cnt = {}; - const squares = new Set(); - - for (const x of new Set(nums)) { - cnt[x] = (cnt[x] ?? -1) + 1; - cnt[x ** 2] = (cnt[x ** 2] ?? -1) + 1; - } - - for (const key in cnt) { - const x = +key; - if (cnt[x] || cnt[x ** 2]) { - squares.add(x); + if (!s.has(x)) { + return 0; } - } - - if (squares.size <= 1) return -1; - - const iterator = squares[Symbol.iterator](); - let [max, c, x] = [0, 0, iterator.next().value]; + f.set(x, 1 + dfs(x ** 2)); + return f.get(x); + }; - while (x !== undefined) { - if (squares.has(x)) { - squares.delete(x); - x **= 2; - c++; - } else { - max = Math.max(max, c); - x = iterator.next().value; - c = 0; - } + for (const x of s) { + dfs(x); } - - return max; -} + const ans = Math.max(...f.values()); + return ans > 1 ? ans : -1; +}; ``` diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.cpp b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.cpp index 619f5422d823d..93be420cef813 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.cpp +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.cpp @@ -3,14 +3,14 @@ class Solution { int longestSquareStreak(vector& nums) { unordered_set s(nums.begin(), nums.end()); int ans = -1; - for (int& v : nums) { + for (long long x : nums) { int t = 0; - long long x = v; - while (s.count(x)) { - x *= x; + for (; s.contains(x); x *= x) { ++t; } - if (t > 1) ans = max(ans, t); + if (t > 1) { + ans = max(ans, t); + } } return ans; } diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.go b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.go index f611bb5353c46..4dcb1c33dbb65 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.go +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.go @@ -1,17 +1,17 @@ func longestSquareStreak(nums []int) int { s := map[int]bool{} - for _, v := range nums { - s[v] = true + for _, x := range nums { + s[x] = true } ans := -1 - for _, v := range nums { + for x := range s { t := 0 - for s[v] { - v *= v + for s[x] { + x *= x t++ } - if t > 1 && t > ans { - ans = t + if t > 1 { + ans = max(ans, t) } } return ans diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.java b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.java index 3a9557a747ed9..a5d10869aad68 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.java +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.java @@ -1,14 +1,13 @@ class Solution { public int longestSquareStreak(int[] nums) { - Set s = new HashSet<>(); - for (int v : nums) { - s.add(v); + Set s = new HashSet<>(); + for (long x : nums) { + s.add(x); } int ans = -1; - for (int v : nums) { + for (long x : s) { int t = 0; - while (s.contains(v)) { - v *= v; + for (; s.contains(x); x *= x) { ++t; } if (t > 1) { diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.js b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.js new file mode 100644 index 0000000000000..2e3be7c941a0e --- /dev/null +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.js @@ -0,0 +1,24 @@ +/** + * @param {number[]} nums + * @return {number} + */ +var longestSquareStreak = function (nums) { + const s = new Set(nums); + let ans = -1; + + for (const num of nums) { + let x = num; + let t = 0; + + while (s.has(x)) { + x *= x; + t += 1; + } + + if (t > 1) { + ans = Math.max(ans, t); + } + } + + return ans; +}; diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.py b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.py index 6c255772d4a04..73318f6e64dca 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.py +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.py @@ -2,10 +2,10 @@ class Solution: def longestSquareStreak(self, nums: List[int]) -> int: s = set(nums) ans = -1 - for v in nums: + for x in nums: t = 0 - while v in s: - v *= v + while x in s: + x *= x t += 1 if t > 1: ans = max(ans, t) diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.ts b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.ts new file mode 100644 index 0000000000000..8f399987e0186 --- /dev/null +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution.ts @@ -0,0 +1,20 @@ +function longestSquareStreak(nums: number[]): number { + const s = new Set(nums); + let ans = -1; + + for (const num of nums) { + let x = num; + let t = 0; + + while (s.has(x)) { + x *= x; + t += 1; + } + + if (t > 1) { + ans = Math.max(ans, t); + } + } + + return ans; +} diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.cpp b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.cpp index 428b56ade443a..7db53d1adca45 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.cpp +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.cpp @@ -3,16 +3,20 @@ class Solution { int longestSquareStreak(vector& nums) { unordered_set s(nums.begin(), nums.end()); int ans = 0; - unordered_map f; - function dfs = [&](int x) -> int { - if (!s.count(x)) return 0; - if (f.count(x)) return f[x]; - long long t = 1ll * x * x; - if (t > INT_MAX) return 1; + unordered_map f; + auto dfs = [&](this auto&& dfs, long long x) -> int { + if (!s.contains(x)) { + return 0; + } + if (f.contains(x)) { + return f[x]; + } f[x] = 1 + dfs(x * x); return f[x]; }; - for (int& v : nums) ans = max(ans, dfs(v)); + for (long long x : s) { + ans = max(ans, dfs(x)); + } return ans < 2 ? -1 : ans; } }; \ No newline at end of file diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.go b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.go index 627d8f43ac444..d5094056e3072 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.go +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.go @@ -1,7 +1,7 @@ func longestSquareStreak(nums []int) (ans int) { s := map[int]bool{} - for _, v := range nums { - s[v] = true + for _, x := range nums { + s[x] = true } f := map[int]int{} var dfs func(int) int @@ -15,8 +15,8 @@ func longestSquareStreak(nums []int) (ans int) { f[x] = 1 + dfs(x*x) return f[x] } - for _, v := range nums { - if t := dfs(v); ans < t { + for x := range s { + if t := dfs(x); ans < t { ans = t } } diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.java b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.java index 428f30cd61025..af326115b682f 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.java +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.java @@ -1,19 +1,19 @@ class Solution { - private Map f = new HashMap<>(); - private Set s = new HashSet<>(); + private Map f = new HashMap<>(); + private Set s = new HashSet<>(); public int longestSquareStreak(int[] nums) { - for (int v : nums) { - s.add(v); + for (long x : nums) { + s.add(x); } int ans = 0; - for (int v : nums) { - ans = Math.max(ans, dfs(v)); + for (long x : s) { + ans = Math.max(ans, dfs(x)); } return ans < 2 ? -1 : ans; } - private int dfs(int x) { + private int dfs(long x) { if (!s.contains(x)) { return 0; } diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.js b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.js index 66ec5cc32c8a0..ecb0fb20bc9b1 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.js +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.js @@ -1,15 +1,24 @@ -function longestSquareStreak(nums) { - const set = new Set(nums); - const cache = new Map(); +/** + * @param {number[]} nums + * @return {number} + */ +var longestSquareStreak = function (nums) { + const s = new Set(nums); + const f = new Map(); const dfs = x => { - if (cache.has(x)) return cache.get(x); - if (!set.has(x)) return 0; - cache.set(x, 1 + dfs(x ** 2)); - return cache.get(x); + if (f.has(x)) { + return f.get(x); + } + if (!s.has(x)) { + return 0; + } + f.set(x, 1 + dfs(x ** 2)); + return f.get(x); }; - for (const x of set) dfs(x); - const ans = Math.max(...cache.values()); - + for (const x of s) { + dfs(x); + } + const ans = Math.max(...f.values()); return ans > 1 ? ans : -1; -} +}; diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.py b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.py index 385f8b98c68bd..1ba5fbee426c4 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.py +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.py @@ -1,11 +1,11 @@ class Solution: def longestSquareStreak(self, nums: List[int]) -> int: @cache - def dfs(x): + def dfs(x: int) -> int: if x not in s: return 0 return 1 + dfs(x * x) s = set(nums) - ans = max(dfs(x) for x in nums) + ans = max(dfs(x) for x in s) return -1 if ans < 2 else ans diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.ts b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.ts index 2546d039a7d4c..9efd1195f120e 100644 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.ts +++ b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution2.ts @@ -1,15 +1,20 @@ function longestSquareStreak(nums: number[]): number { - const set = new Set(nums); - const cache = new Map(); + const s = new Set(nums); + const f = new Map(); const dfs = (x: number): number => { - if (cache.has(x)) return cache.get(x)!; - if (!set.has(x)) return 0; - cache.set(x, 1 + dfs(x ** 2)); - return cache.get(x)!; + if (f.has(x)) { + return f.get(x)!; + } + if (!s.has(x)) { + return 0; + } + f.set(x, 1 + dfs(x ** 2)); + return f.get(x)!; }; - for (const x of set) dfs(x); - const ans = Math.max(...cache.values()); - + for (const x of s) { + dfs(x); + } + const ans = Math.max(...f.values()); return ans > 1 ? ans : -1; } diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.js b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.js deleted file mode 100644 index e552e1872c385..0000000000000 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.js +++ /dev/null @@ -1,35 +0,0 @@ -function longestSquareStreak(nums) { - const cnt = {}; - const squares = new Set(); - - for (const x of new Set(nums)) { - cnt[x] = (cnt[x] ?? -1) + 1; - cnt[x ** 2] = (cnt[x ** 2] ?? -1) + 1; - } - - for (const key in cnt) { - const x = +key; - if (cnt[x] || cnt[x ** 2]) { - squares.add(x); - } - } - - if (squares.size <= 1) return -1; - - const iterator = squares[Symbol.iterator](); - let [max, c, x] = [0, 0, iterator.next().value]; - - while (x !== undefined) { - if (squares.has(x)) { - squares.delete(x); - x **= 2; - c++; - } else { - max = Math.max(max, c); - x = iterator.next().value; - c = 0; - } - } - - return max; -} diff --git a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.ts b/solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.ts deleted file mode 100644 index e0f94ebad443a..0000000000000 --- a/solution/2500-2599/2501.Longest Square Streak in an Array/Solution3.ts +++ /dev/null @@ -1,35 +0,0 @@ -function longestSquareStreak(nums: number[]): number { - const cnt: Record = {}; - const squares = new Set(); - - for (const x of new Set(nums)) { - cnt[x] = (cnt[x] ?? -1) + 1; - cnt[x ** 2] = (cnt[x ** 2] ?? -1) + 1; - } - - for (const key in cnt) { - const x = +key; - if (cnt[x] || cnt[x ** 2]) { - squares.add(x); - } - } - - if (squares.size <= 1) return -1; - - const iterator = squares[Symbol.iterator](); - let [max, c, x] = [0, 0, iterator.next().value]; - - while (x !== undefined) { - if (squares.has(x)) { - squares.delete(x); - x **= 2; - c++; - } else { - max = Math.max(max, c); - x = iterator.next().value; - c = 0; - } - } - - return max; -}