File tree Expand file tree Collapse file tree 2 files changed +84
-0
lines changed
solution/2500-2599/2501.Longest Square Streak in an Array Expand file tree Collapse file tree 2 files changed +84
-0
lines changed Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ private Map <Integer , Integer > memo = new HashMap <>(); // Memoization map
3
+ private Set <Integer > numSet = new HashSet <>(); // Set of numbers
4
+
5
+ public int longestSquareStreak (int [] nums ) {
6
+ // Early exit if the array length is less than 2
7
+ if (nums .length < 2 )
8
+ return -1 ;
9
+
10
+ // Add numbers to the set for quick lookup
11
+ for (int n : nums ) {
12
+ numSet .add (n );
13
+ }
14
+
15
+ int maxStreak = 0 ; // Track the maximum streak
16
+ // Calculate the longest square streak for each number
17
+ for (int n : nums ) {
18
+ maxStreak = Math .max (maxStreak , dfs (n ));
19
+ }
20
+
21
+ return maxStreak < 2 ? -1 : maxStreak ; // Return result
22
+ }
23
+
24
+ private int dfs (int x ) {
25
+ // Base case: if x is not in the set, return 0
26
+ if (!numSet .contains (x )) {
27
+ return 0 ;
28
+ }
29
+
30
+ // Return cached result if already computed
31
+ if (memo .containsKey (x )) {
32
+ return memo .get (x );
33
+ }
34
+
35
+ // Calculate the next number in the square streak
36
+ long next = (long ) x * x ; // Use long to avoid overflow
37
+ // If the next number exceeds the maximum allowed value, return 0
38
+ if (next > 100000 ) {
39
+ memo .put (x , 1 ); // Only count this number itself
40
+ return 1 ;
41
+ }
42
+
43
+ // Recursively calculate the streak
44
+ int streak = 1 + dfs ((int ) next ); // Include the current number in the streak
45
+ memo .put (x , streak ); // Cache the result
46
+ return streak ;
47
+ }
48
+ }
Original file line number Diff line number Diff line change
1
+ public class Solution {
2
+ public int longestSquareStreak (int [] nums ) {
3
+ int maxStreak = -1 ; // Track the maximum streak
4
+ final int MAX_NUM = (int ) Math .pow (10 , 5 ); // Maximum value for nums
5
+ boolean [] exists = new boolean [MAX_NUM + 1 ]; // Track existence of numbers
6
+ boolean [] visited = new boolean [MAX_NUM + 1 ]; // Track visited numbers
7
+
8
+ // Mark existing numbers
9
+ for (int num : nums ) {
10
+ exists [num ] = true ;
11
+ }
12
+
13
+ // Check for square streaks
14
+ for (int i = 2 ; i * i <= MAX_NUM ; i ++) {
15
+ if (!exists [i ] || visited [i ]) {
16
+ continue ; // Skip if number doesn't exist or is already visited
17
+ }
18
+ visited [i ] = true ; // Mark as visited
19
+ int streakLength = 1 ; // Start streak length
20
+ long j = (long ) i * i ; // Calculate square (use long to avoid overflow)
21
+
22
+ // Continue while j is valid and exists
23
+ while (j >= 0 && j <= MAX_NUM && exists [(int ) j ]) {
24
+ visited [(int ) j ] = true ; // Mark as visited
25
+ streakLength ++; // Increase streak length
26
+ j = j * j ; // Move to next square
27
+ }
28
+
29
+ // Update maximum streak if valid
30
+ if (streakLength > 1 ) {
31
+ maxStreak = Math .max (maxStreak , streakLength );
32
+ }
33
+ }
34
+ return maxStreak ; // Return the maximum streak found
35
+ }
36
+ }
You can’t perform that action at this time.
0 commit comments