2501. 数组中最长的方波

59 阅读1分钟

题目:
给你一个整数数组 nums 。如果 nums 的子序列满足下述条件,则认为该子序列是一个 方波 :

  • 子序列的长度至少为 2 ,并且
  • 将子序列从小到大排序 之后 ,除第一个元素外,每个元素都是前一个元素的 平方 。

返回 **nums **中 最长方波 的长度,如果不存在 方波 **则返回 **-1 。

子序列 也是一个数组,可以由另一个数组删除一些或不删除元素且不改变剩余元素的顺序得到。
算法:

方法一:排序+二分
先排序,然后通过二分查找x的平方x * x是否存在。(也可以用hash判断)

func longestSquareStreak(nums []int) int {
    if len(nums) < 2 {
        return -1
    }
    sort.Ints(nums)
    ans := 0
    n := len(nums)
    for i := range nums {
        max := 1
        nextVal := nums[i] * nums[i]
        j := i + 1
        for  {
            nextIndex := nextValIndex(nextVal, nums, j, n - 1) 
            if nextIndex == -1 {
                break
            }
            nextVal = nextVal * nextVal
            max ++
            j = nextIndex + 1
        }
        if max > ans {
            ans = max
        }
    }
    if ans < 2 {
        return -1
    }
    return ans
}

func nextValIndex(target int, nums []int, left, right int) int {
    for left <= right {
        mid := (left + right) / 2
        if nums[mid] == target {
            return mid
        } else if nums[mid] < target {
            left = mid + 1
        } else {
            right = mid - 1
        }
    }
    return -1
}