第 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;
    }
}
相关推荐
L.EscaRC2 小时前
Spring Boot开发中加密数据的模糊搜索
java·spring boot·后端
艾莉丝努力练剑2 小时前
【Linux基础开发工具 (六)】Linux中的第一个系统程序——进度条Linux:详解回车、换行与缓冲区
java·linux·运维·服务器·c++·centos
8Qi82 小时前
Redis之Lua脚本与分布式锁改造
java·redis·分布式·lua
钱多多_qdd2 小时前
mini-spring基础篇:IoC(十一):Aware接口
java·spring
像风一样自由20202 小时前
U-Net 图像分割算法:从零开始的完全指南
算法
AM越.2 小时前
Java设计模式超详解——抽象工厂设计模式(含UML图)
java·设计模式·uml
嵌入式小能手2 小时前
飞凌嵌入式ElfBoard-文件I/O的深入学习之文件锁
java·服务器·学习
Predestination王瀞潞2 小时前
Java EE开发技术 (报错解决 请求的资源[/Bank/$%7BpageContext.request.contextPath%7D/login]不可用)
java·java-ee