开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
前言
小白算法比较菜,希望能激励我每日更新,从leetcode第一题开始,2022年目标2000分,现在1916!!
力扣第 323 场双周赛-力扣
第 323 场双周赛
参赛的人越来越少了,可算是跌破了5000了
近几次排名对比。
2501. 数组中最长的方波
给你一个整数数组 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
代码
拿到题之后想的有点复杂,最后想到就算是2的次方也就到2的31次方就是最大了,从2^1到2^2到2^4到2^31最多答案也是只有5.
所以选用set将所有数组添加进入arr之后,对每个num遍历,fun就是去查以sum为起点找sum^2、sum^4能找到多少个,依次更新res
因为set会自动去重,一定程度上也可以减少复杂度,复杂度为O(n)
class Solution {
public int longestSquareStreak(int[] nums) {
Arrays.sort(nums);
HashSet<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
set.add(nums[i]);
}
int res = -1;
for (int i = 0; i < nums.length; i++) {
res = Math.max(res, fun(nums[i], set));
}
if(res < 2) {
return -1;
}
return res;
}
private int fun(int num, HashSet<Integer> set) {
int t = 0;
while (set.contains(num)) {
num = num * num;
t++;
}
return t;
}
}
3.结束
应该是,第三次ak了,最近两个月都没有花很多时间在算法上,确实也没什么明显的进步,但是偶尔自己能想出来第四题的感觉还算不错的。
四题也上不了多少分了