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
解法
方法一:哈希表 + 枚举
思考
方波要求相邻项满足后者为前者的平方。枚举全部子序列在 \(n\le 10^5\) 下不可行;即便只检查有序链,若每次在数组中线性查找后继,仍会浪费有序性之外的结构。
注意到后继由 \(x\mapsto x^2\) 唯一确定,只需判断平方是否仍在数组中。将 \(\textit{nums}\) 放入集合后,从每个起点反复平方即可得到该链长度。平方增长极快,链长仅为 \(O(\log\log M)\),故总时间可接受。长度不超过 \(1\) 时按题意记为 \(-1\)。
我们先用哈希表记录数组中的所有元素,然后枚举数组中的每个元素作为子序列的第一个元素,将该元素不断平方,并判断平方后的结果是否在哈希表中,如果在,则将平方后的结果作为下一个元素,继续判断,直到平方后的结果不在哈希表中,此时判断子序列的长度是否大于 \(1\),如果是,则更新答案。
时间复杂度 \(O(n \times \log \log M)\),空间复杂度 \(O(n)\)。其中 \(n\) 为数组 \(\textit{nums}\) 的长度,而 \(M\) 为数组 \(\textit{nums}\) 中的元素的最大值。
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |
方法二:记忆化搜索
思考
方法一从每个起点独立延伸,若两条链共享后缀(例如 \(2,4,16\) 与 \(4,16\)),则会重复计算。
以 \(\textit{dfs}(x)\) 表示从 \(x\) 出发的方波长度,转移为 \(1+\textit{dfs}(x^2)\),不在集合中则返回 \(0\)。记忆化后每个值只算一次,时间降为线性。答案取所有起点的最大值,不足 \(2\) 则返回 \(-1\)。
与方法一类似,我们先用哈希表记录数组中的所有元素。然后设计一个函数 \(\textit{dfs}(x)\),表示以 \(x\) 为第一个元素的方波的长度。那么答案就是 \(\max(\textit{dfs}(x))\),其中 \(x\) 为数组 \(\textit{nums}\) 中的元素。
函数 \(\textit{dfs}(x)\) 的计算过程如下:
- 如果 \(x\) 不在哈希表中,则返回 \(0\)。
- 否则,返回 \(1 + \textit{dfs}(x^2)\)。
过程中我们可以使用记忆化搜索,即使用哈希表记录函数 \(\textit{dfs}(x)\) 的值,避免重复计算。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。其中 \(n\) 为数组 \(\textit{nums}\) 的长度。
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | |