Skip to content

Latest commit

 

History

History
64 lines (50 loc) · 1.83 KB

File metadata and controls

64 lines (50 loc) · 1.83 KB

2501. Longest Square Streak in an Array

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 (Rust)

1. Solution

use std::collections::HashSet;

impl Solution {
    pub fn longest_square_streak(nums: Vec<i32>) -> i32 {
        let mut nums = nums;
        let mut nums_set = nums.clone().into_iter().collect::<HashSet<_>>();
        let mut ret = -1;

        nums.sort_unstable();

        for &num in &nums {
            let mut length = 1;
            let mut x = num;

            while x < 317 && nums_set.remove(&(x * x)) {
                x *= x;
                length += 1;
            }

            if length > ret.max(1) {
                ret = length
            }
        }

        ret
    }
}