第 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;
    }
}
相关推荐
wangluoqi几秒前
26.2.6练习总结
数据结构·算法
Yvonne爱编码3 分钟前
链表高频 6 题精讲 | 从入门到熟练掌握链表操作
java·数据结构·链表
Q741_1475 分钟前
C++ 优先级队列 大小堆 模拟 力扣 703. 数据流中的第 K 大元素 每日一题
c++·算法·leetcode·优先级队列·
网安墨雨7 分钟前
Python自动化一------pytes与allure结合生成测试报告
开发语言·自动化测试·软件测试·python·职场和发展·自动化
lpfasd1238 分钟前
物联网后端岗位java面试题
java·物联网·php
毕设源码李师姐9 分钟前
计算机毕设 java 基于 java 的图书馆借阅系统 智能图书馆借阅综合管理平台 基于 Java 的图书借阅与信息管理系统
java·开发语言·课程设计
忆~遂愿10 分钟前
Runtime 上下文管理:计算实例的生命周期、延迟最小化与上下文切换优化
java·大数据·开发语言·人工智能·docker
powerfulhell15 分钟前
寒假python作业5
java·前端·python
1尢晞116 分钟前
Java学习
java·开发语言
阿杰真不会敲代码18 分钟前
Mybatis-plus入门到精通
java·tomcat·mybatis