【从零开始的LeetCode-算法】3020. 子集中元素的最大数量-输入:nums = [1,3,2,4] 输出:1 解释:选择子集 {1},将其放在数组 [1] 中,它遵循该模式。因此答案是 1 。注意我们也可以选择子集 {2} 、{4} 或 {3} ,可能存在多个子集都能得到相同的答案。 提示:

时间:2024-10-29 15:13:30
  • 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;
    }
}