- [Leetcode 2862. Maximum Element-Sum of a Complete Subset of Indices](#Leetcode 2862. Maximum Element-Sum of a Complete Subset of Indices)
- [1. 解题思路](#1. 解题思路)
- [2. 代码实现](#2. 代码实现)
1. 解题思路
这一题的核心在于想明白一点:
- 要使得子序列当中任意两个数之积均为平方数,那么子序列当中的所有数必然都是一系列平方数的某一个公倍数。
因此,我们只需要不超过数组长度 n n n的所有平方数,然后分别将其扩展倍数即可。
而对于扩展倍数之后依然有效的平方数,我们同样可以通过二分法进行优化寻找。
2. 代码实现
给出python代码实现如下:
python
class Solution:
def maximumSum(self, nums: List[int]) -> int:
n = len(nums)
completes = [i*i for i in range(1, int(sqrt(n) + 2)) if i * i <= n]
res = max(max(nums), sum([nums[i-1] for i in completes]))
for p in range(1, n+1):
if p > n:
break
if completes[-1] * p > n:
i, j = 0, len(completes)-1
while j-i>1:
m = (i+j)//2
if completes[m] * p > n:
j = m
else:
i = m
else:
j = len(completes)
if j == 1:
break
s = sum([nums[p*i-1] for i in completes[:j]])
res = max(res, s)
return res
提交代码评测得到:耗时290ms,占用内存18.1MB。