第 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;
    }
}
相关推荐
非优秀程序员4 小时前
第05章 播放器大战,暴风、快播与那一夜|《互联网产品恩仇录》
算法
非优秀程序员4 小时前
第04章 邮箱大战,163 与 QQ 的暗战|《互联网产品恩仇录》
java·vue.js·架构
知已难寻5 小时前
Docker 入门:容器技术与 Docker 基础
java·运维·服务器·docker·云原生·容器
文丑颜不良啊7 小时前
LeetCode2481~2500题目解析
java·leetcode
Flynn Liang8 小时前
同一需求三套写法:用 Spring AI、LangChain4j、AgentScope Java 各实现一个带工具调用的 RAG 助手(实战对比)
java·人工智能·大模型·架构设计·spring ai·langchain4j·agentscope
聪明的笨猪猪8 小时前
实际工程问题:AI 生成 Spring Cache(@Cacheable / @CachePut / @CacheEvict)缓存注解踩坑
java·经验分享·面试·ai编程
愿有所息9 小时前
记一次 ARM64 + JDK8 上 fastjson2 的诡异数据错乱
java
秋饼9 小时前
MCP 2026-07-28 无状态协议大改版:Spring AI 2.1 多轮往返请求与网关路由落地
java·ai·技术分享·后端开发
SL_staff10 小时前
JVS-BI 实战:业务人员如何用零代码 ELT + 可视化配置构建实时经营分析闭环
java·spring·全栈