第323场周赛-第二题

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

子序列的长度至少为 2 ,并且
将子序列从小到大排序 之后 ,除第一个元素外,每个元素都是前一个元素的 平方 。
返回 nums 中 最长方波 的长度,如果不存在 方波 则返回 -1 。

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

 

示例 1 :

输入:nums = [4,3,6,16,8,2]
输出:3
解释:选出子序列 [4,16,2] 。排序后,得到 [2,4,16] 。
- 4 = 2 * 2.
- 16 = 4 * 4.
因此,[4,16,2] 是一个方波.
可以证明长度为 4 的子序列都不是方波。
示例 2 :

输入:nums = [2,3,5,6,7]
输出:-1
解释:nums 不存在方波,所以返回 -1 。
 

提示:

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

思路:将nums由小到大排序后,用一个map,对于nums[i]来说,如果nums[i]^2∈nums,则map[nums[i]] = nums[i]^2,这样一来通过,以下操作就能的出nums[i]为第一个数的最长链

int k = nums[i];
while(map[k]!=-1&&map[k]!=0)
            {
              k = map[k];
              temp++;
            }

完整代码如下,时间开销230ms

class Solution {
    int temp = 1;
    int ans = -1;
    unordered_map<int,int> m;
public:
    int longestSquareStreak(vector<int>& nums) {
        sort(nums.begin(),nums.end());
        for(int i = 0;i<nums.size();i++)
        {
            if(m[nums[i]]==0)
            {
                m[nums[i]] = -1;
            }
            int p = sqrt(nums[i]);
            if(p*p==nums[i]&&m[p]!=0)
            {
                m[p] = nums[i];
            }
        }
        for(int i = 0;i<nums.size();i++)
        {
            int k = nums[i];
            while(m[k]!=-1&&m[k]!=0)
            {
              k = m[k];
              temp++;
            }
            ans = max(ans,temp);
            temp = 1;
        }
        if(ans>=2)
        return ans;
        else
        return -1;
    }
};

 

posted @ 2022-12-30 20:46  remarkableboy  阅读(19)  评论(0编辑  收藏  举报