Welcome to Subscribe On Youtube

2501. Longest Square Streak in an Array

Description

You are given an integer array nums. A subsequence of nums is called a square streak if:

  • The length of the subsequence is at least 2, and
  • after sorting the subsequence, each element (except the first element) is the square of the previous number.

Return the length of the longest square streak in nums, or return -1 if there is no square streak.

A subsequence is an array that can be derived from another array by deleting some or no elements without changing the order of the remaining elements.

 

Example 1:

Input: nums = [4,3,6,16,8,2]
Output: 3
Explanation: Choose the subsequence [4,16,2]. After sorting it, it becomes [2,4,16].
- 4 = 2 * 2.
- 16 = 4 * 4.
Therefore, [4,16,2] is a square streak.
It can be shown that every subsequence of length 4 is not a square streak.

Example 2:

Input: nums = [2,3,5,6,7]
Output: -1
Explanation: There is no square streak in nums so return -1.

 

Constraints:

  • 2 <= nums.length <= 105
  • 2 <= nums[i] <= 105

Solutions

  • class Solution {
        public int longestSquareStreak(int[] nums) {
            Set<Integer> s = new HashSet<>();
            for (int v : nums) {
                s.add(v);
            }
            int ans = -1;
            for (int v : nums) {
                int t = 0;
                while (s.contains(v)) {
                    v *= v;
                    ++t;
                }
                if (t > 1) {
                    ans = Math.max(ans, t);
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        int longestSquareStreak(vector<int>& nums) {
            unordered_set<long long> s(nums.begin(), nums.end());
            int ans = -1;
            for (int& v : nums) {
                int t = 0;
                long long x = v;
                while (s.count(x)) {
                    x *= x;
                    ++t;
                }
                if (t > 1) ans = max(ans, t);
            }
            return ans;
        }
    };
    
  • class Solution:
        def longestSquareStreak(self, nums: List[int]) -> int:
            s = set(nums)
            ans = -1
            for v in nums:
                t = 0
                while v in s:
                    v *= v
                    t += 1
                if t > 1:
                    ans = max(ans, t)
            return ans
    
    
  • func longestSquareStreak(nums []int) int {
    	s := map[int]bool{}
    	for _, v := range nums {
    		s[v] = true
    	}
    	ans := -1
    	for _, v := range nums {
    		t := 0
    		for s[v] {
    			v *= v
    			t++
    		}
    		if t > 1 && t > ans {
    			ans = t
    		}
    	}
    	return ans
    }
    
  • 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;
    }
    
    
  • /**
     * @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;
    };
    
    
  • class Solution {
        private Map<Long, Integer> f = new HashMap<>();
        private Set<Long> s = new HashSet<>();
    
        public int longestSquareStreak(int[] nums) {
            for (long x : nums) {
                s.add(x);
            }
            int ans = 0;
            for (long x : s) {
                ans = Math.max(ans, dfs(x));
            }
            return ans < 2 ? -1 : ans;
        }
    
        private int dfs(long x) {
            if (!s.contains(x)) {
                return 0;
            }
            if (f.containsKey(x)) {
                return f.get(x);
            }
            int ans = 1 + dfs(x * x);
            f.put(x, ans);
            return ans;
        }
    }
    
  • class Solution {
    public:
        int longestSquareStreak(vector<int>& nums) {
            unordered_set<long long> s(nums.begin(), nums.end());
            int ans = 0;
            unordered_map<long long, int> 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 (long long x : s) {
                ans = max(ans, dfs(x));
            }
            return ans < 2 ? -1 : ans;
        }
    };
    
  • class Solution:
        def longestSquareStreak(self, nums: List[int]) -> int:
            @cache
            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 s)
            return -1 if ans < 2 else ans
    
    
  • func longestSquareStreak(nums []int) (ans int) {
    	s := map[int]bool{}
    	for _, x := range nums {
    		s[x] = true
    	}
    	f := map[int]int{}
    	var dfs func(int) int
    	dfs = func(x int) int {
    		if !s[x] {
    			return 0
    		}
    		if v, ok := f[x]; ok {
    			return v
    		}
    		f[x] = 1 + dfs(x*x)
    		return f[x]
    	}
    	for x := range s {
    		if t := dfs(x); ans < t {
    			ans = t
    		}
    	}
    	if ans < 2 {
    		return -1
    	}
    	return ans
    }
    
  • function longestSquareStreak(nums: number[]): number {
        const s = new Set(nums);
        const f = new Map<number, number>();
        const dfs = (x: number): number => {
            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 s) {
            dfs(x);
        }
        const ans = Math.max(...f.values());
        return ans > 1 ? ans : -1;
    }
    
    
  • /**
     * @param {number[]} nums
     * @return {number}
     */
    var longestSquareStreak = function (nums) {
        const s = new Set(nums);
        const f = new Map();
        const dfs = 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 s) {
            dfs(x);
        }
        const ans = Math.max(...f.values());
        return ans > 1 ? ans : -1;
    };
    
    

All Problems

All Solutions