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.

solution

def longestSquareStreak(self, nums: List[int]) -> int:
	n = len(nums)
	nums.sort()
	  
	# dp[i] is longest valid subsequence ending at i
	dp = [1]*n
	  
	# next val in sequence, idx of prev val
	next_vals = {nums[0]**2: 0}
	  
	for i in range(1, len(nums)):
		if nums[i] in next_vals:
			dp[i] = max(dp[i], dp[next_vals[nums[i]]]+1)
		next_vals[nums[i]**2] = i
 
	best = max(dp)
	return best if best > 1 else -1