A.每日一题:3020. 子集中元素的最大数量

题目链接:3020. 子集中元素的最大数量(中等)

算法原理:

解法:哈希表

56ms击败84.73%

时间复杂度O(N)

整体思路:将所有数扔进哈希表,然后逐一遍历,看这个数出现了几次,如果出现1次,就让 mx 和 1 更新最大值,否则就继续探寻

这里的探寻的意思:如果这个数是 2,那么就看 4是否存在:

①如果不存在:退出探寻

②如果存在:更新 mx

如果 4 只出现 1 次,不再探寻了,因为无法保证两边对称

如果 4 出现≥ 2 次,继续探寻

这里更新的时候,注意这里的幂数是2的 k 次幂,因此取值的时候,需要套两层 Math.pow()

这个数就可以表示为:Math.pow(key,Math.pow(2,k)),我们后续更新 mx 的时候就可以通过 k 来更新

拿 2 , 4 , 16, 4 , 2 为例,表示为 2¹ , 2² , 2⁴ , 2² , 2¹ 这里 k 最大为 3,那么长度就是 2 × 3 -1 = 5,因此更新的长度表示为 2 × k + 1

特殊情况处理:当 key 为 1 时,1¹ = 1、1² = 1、1⁴ = 1......

因此这个时候只需要统计 1 的个数 n 即可:

n 为奇数,mx = max(mx,n)

n 为偶数,mx = max(mx,n-1)

细节:使用 Math.pow() 时,要注意精度转换,将 double 强制转换成 int

Java代码:

java 复制代码
class Solution {
    //3020. 子集中元素的最大数量
    public int maximumLength(int[] nums) {
        if(nums.length==0) return 0;
        Map<Integer,Integer> hash=new HashMap<>();
        for(int x:nums) hash.merge(x,1,Integer::sum);
        int mx=1;
        for(Map.Entry<Integer,Integer> entry:hash.entrySet()){
            int key=entry.getKey();
            int val=entry.getValue();
            //特殊处理:1
            if(key==1){
                int n=hash.get(1);
                if(n%2==1) mx=Math.max(mx,n);
                else mx=Math.max(mx,n-1);
                continue;
            }
            if(val==1){
                mx=Math.max(mx,1);
                continue;
            }
            int k=1;
            while(hash.containsKey((int)Math.pow(key,Math.pow(2,k)))){
                mx=Math.max(mx,2*k+1);
                if(hash.get((int)Math.pow(key,Math.pow(2,k)))==1) break;
                k++;
            }
        }
        return mx;
    }
}
相关推荐
文丑颜不良啊几秒前
LeetCode1341~1360题目解析
java·leetcode
H_BB24 分钟前
面试笔记:数据加密和心跳机制
笔记·面试·职场和发展
QianhangQianping28 分钟前
撤销重做不是「存快照」:一个可视化编辑器的Operation 设计
java·前端·数据库·typescript·编辑器·前端架构·撤销重做
海绵宝宝转agent33 分钟前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
SunnyDays101134 分钟前
Java 操作 Word 脚注和尾注:添加、读取与删除
java·word
SunnyDays101136 分钟前
Java 为 Word 添加页码:隐藏封面页码、从指定页开始编号、奇偶页页码设置等
java·word·页码
开源推荐官40 分钟前
多门店 O2O 商城选型复盘:从开发视角对比主流开源系统
java·架构·开源·php
吴名氏.41 分钟前
Java转AI Agent教程(第二周)超时重试与错误分类
java·人工智能·python·分类·ai agent
青少儿编程课堂42 分钟前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
j7~1 小时前
【C++ 面试笔记】(篇二):类与数据抽象 & STL 容器与算法
开发语言·c++·面试·stl容器和算法·类和数据抽象