第 479 场周赛Q2——3770. 可表示为连续质数和的最大质数

题目链接:3770. 可表示为连续质数和的最大质数(中等)

算法原理:

解法:前缀和+埃氏筛

击败33.69%

时间复杂度O(NLogLogN)

①边界处理:若 n=1,直接返回 0

②埃氏筛标记质数:初始化布尔数组标记 0~n 是否为质数,筛除所有非质数

③收集质数:遍历数组提取所有≤n 的质数,存入列表

④计算前缀和并截断:生成质数前缀和数组,和超过 n 时截断数组

⑤逆序查找:从前缀和数组末尾逆序找第一个是质数的和,无则返回 0

Java代码:

java 复制代码
class Solution {
    public int largestPrime(int n) {
        if(n==1) return 0;
        //核心优化:用埃氏筛标记质数,替代islegal和HashSet
        boolean[] isPrime=new boolean[n+1];
        for(int i=2;i<=n;i++) isPrime[i]=true;//先默认所有数都是质数
        for(int i=2;i*i<=n;i++){
            if(isPrime[i]){
                //如果i是质数,那么i的所有倍数都不是质数
                for(int j=i*i;j<=n;j+=i)
                    isPrime[j]=false;
            }
        }
        List<Integer> prime=new ArrayList<>();
        for(int i=2;i<=n;i++)
            if(isPrime[i])
                prime.add(i);
        int[] sum=new int[prime.size()];
        if(prime.isEmpty()) return 0;
        sum[0]=prime.get(0);
        if(sum[0]>n) return 0;
        for(int i=1;i<prime.size();i++){
            sum[i]=sum[i-1]+prime.get(i);
            if(sum[i]>n){
                //及时截断
                sum=Arrays.copyOf(sum,i);
                break;
            }
        }
        for(int i=sum.length-1;i>=0;i--)
            if(isPrime[sum[i]]) return sum[i];
        return 0;
    }
}
相关推荐
Seven973 分钟前
【从0到1构建一个ClaudeAgent】规划与协调-TodoWrite
java
Yeh2020585 分钟前
maven
java·maven
ths5125 分钟前
测试开发python中正则表达式使用总结(二)
开发语言·python·算法
色空大师5 分钟前
【java打包方式详解】
java·开发语言·部署·打包·启动脚本·jar包分离
人道领域6 分钟前
2026年Java后端热点全景解析:从LTS革新到云原生跃迁
java·开发语言
鱼鳞_8 分钟前
Java学习笔记_Day26(不可变集合)
java·笔记·学习
不爱吃炸鸡柳9 分钟前
5道经典贪心算法题详解:从入门到进阶
开发语言·数据结构·c++·算法·贪心算法
zhaoyufei13310 分钟前
RK3566 EDP屏幕背光闪修改pwm
android·java
枫叶林FYL15 分钟前
【自然语言处理 NLP】8.3 长文本推理评估与针在大海堆任务
人工智能·算法