2 <= nums.length <= 10^5
1 <= nums[i] <= 10^9
我的解答:
class Solution {
public int maximumLength(int[] nums) {
Map<Double,Integer> map = new HashMap<Double,Integer>();
for(double i : nums){
map.put(i,map.getOrDefault(i,0) + 1);
}
int res = 0;
for(double key : map.keySet()){
int len = 1;
// 1 只能与1组合,特殊处理
if(key == 1){
len = map.get(key) % 2 == 0 ? map.get(key) - 1 : map.get(key);
res = Math.max(res,len);
continue;
}
// 如果存在平方根,且数量大于等于2,则说明当前元素不是组成符合条件子集的最小元素
if(map.containsKey(Math.sqrt(key)) && map.get(Math.sqrt(key)) >= 2 ) continue;
while(true){
// 判断是否存在当前元素平方,且当前元素数量大于等于2
if(map.containsKey(key * key) && map.get(key) >= 2){
key *= key;
// 非子集最大元素,都是左右个一个,所以每有一个非最大元素,长度都加2
len += 2;
}else{
break;
}
}
res = Math.max(res,len);
}
return res;
}
}