开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
前言
从零开始学习c++,每天起码做一道leetcode题目,在此记录,希望最后能够有所收获!
一、题目描述
给你一个整数数组 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 <= 1052 <= nums[i] <= 105
二、思路分析
这题跟前面的求最长子序列很像,我尝试了一下,超出了时间限制。
那说明是双循环不行?但写到这我忽然想起来也许可以先晒除掉一些元素再双循环,也许就能通过了。
说回这题,方法是相当巧妙的,但一定程度上跟求最长子序列那题也有相似之处,先是创建了一个map,然后将nums中每一个元素都作为键,如果后面别的元素和它的开方后所得的数相等,那么那个元素就在该元素的键值上加1。
三、AC代码
class Solution {
public:
int longestSquareStreak(vector<int>& nums) {
map<int,int>vec;
int ans=0;
sort(nums.rbegin(), nums.rend());
for(int i=0;i<nums.size();i++){
if(nums[i]<317){
vec[nums[i]]=vec[nums[i]*nums[i]]+1;
}
else{
vec[nums[i]]=1;
}
ans=max(ans,vec[nums[i]]);
}
return ans>=2?ans:-1;
}
};
提交排名
四、总结
方法非常巧妙,附带了map的一些用法上的微小之处,让我收获良多。