Skip to content

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

Solution: Dynamic Programming

  • Time complexity: O(nlogn)
  • Space complexity: O(n)

 

JavaScript

js
/**
 * @param {number[]} nums
 * @return {number}
 */
const longestSquareStreak = function (nums) {
  const n = nums.length;
  const memo = new Map();
  let result = 0;

  nums.sort((a, b) => a - b);

  for (const num of nums) {
    const sqrt = Math.sqrt(num);
    const length = memo.has(sqrt) ? memo.get(sqrt) + 1 : 1;

    memo.set(num, length);
    result = Math.max(length, result);
  }
  return result > 1 ? result : -1;
};

Released under the MIT license