【算法】Prime Pairs With Target Sum 和等于目标值的质数对

news/2024/7/5 5:00:56

文章目录

  • Prime Pairs With Target Sum 和等于目标值的质数对
    • 问题描述:
    • 分析
    • 代码
    • Tag

Prime Pairs With Target Sum 和等于目标值的质数对

问题描述:

给你一个整数 n 。如果两个整数 x 和 y 满足下述条件,则认为二者形成一个质数对:

1 <= x <= y <= n
x + y == n
x 和 y 都是质数
请你以二维有序列表的形式返回符合题目要求的所有 [ x i , y i ] [x_i, y_i] [xi,yi],列表需要按 xi 的 非递减顺序 排序。如果不存在符合要求的质数对,则返回一个空数组。

注意:质数是大于 1 的自然数,并且只有两个因子,即它本身和 1 。

1 < = n < = 1 0 6 1<=n<=10^6 1<=n<=106

分析

问题本身不复杂,就是要在1~n的范围内找到x,y,并且加和为 n n n

如果不考虑其他的条件,整个问题就是two sum的变形。
但是额外的要求就是 x < = y x<=y x<=y,并且是质数

质数的定义,就是只能被1和它自己整除。

所以策略就是从 1 → n 1\rightarrow n 1n,枚举 x x x,从而得到 y = n − x y=n-x y=nx,同时需要判断 x x x y y y是质数。

Risk

如果使用最简单的暴力枚举判断x是否为质数,那么它的时间复杂度就是 O ( N ) O(\sqrt{N}) O(N ),而 x x x的最少要枚举到 n / 2 n/2 n/2。以问题的最大规模 n = 1 0 6 n=10^6 n=106,一共要判断 n n n次质数,时间复杂度为 O ( N ∗ N ) O(N*\sqrt{N}) O(NN ),整体的规模大概是 1 0 9 10^9 109

所以需要其他更优秀的方法来完成质数的验证。

比如 素数筛,埃氏筛或者欧拉筛。

这2个筛都可以在接近 O ( N ) O(N) O(N)的时间复杂度内,完成对 1 →   n 1\rightarrow ~n 1 n中所有质数标记。

所以使用线性的时间复杂度,完成质数的标记。然后再以线性时间复杂度完成X的枚举,整体时间复杂度 O ( N ) O(N) O(N),几乎完美。

但是素数筛,自身是需要 O ( N ) O(N) O(N)的空间,即 1 0 6 10^6 106.

代码

	private boolean[] flag;
    private long _n; 
    private void init(){// 埃氏筛
        flag = new boolean[(int)_n];
        for (long i = 2; i < flag.length; i++) {
            if (!flag[(int)i]) {		  
                if((long)(i*i)>_n) continue;
			    for (long j = i*i; j < flag.length; j+= i) {
					flag[(int)j] = true;
				}
			}
        }
    } 
	public List<List<Integer>> findPrimePairs(int n) {	
        ArrayList<List<Integer>> list = new ArrayList<>();
        _n = n;
        init();
		for (int i = 2; i <= n / 2; i++) {          
			if (!flag[i] &&!flag[n-i]){
				list.add(List.of(i, n - i));
			}
		}
		return list;
	}

时间复杂度 O ( N log ⁡ log ⁡ N ) O(N\log \log N) O(NloglogN)

空间复杂度 O ( N ) O(N) O(N)

欧拉筛方法的也可以做, 时间复杂度 O ( N ) O(N) O(N)

Tag

Math


http://lihuaxi.xjx100.cn/news/1305219.html

相关文章

cf1406 C 树的重心

题意&#xff1a;https://www.luogu.com.cn/problem/CF1406C 思路&#xff1a;首先需要知道树的重心的一些性质&#xff0c;可以看看这篇文章 https://zhuanlan.zhihu.com/p/357938161 那么这题就是找出重心&#xff0c;如果有两个就将他的一个子树移到另一个重心上。 /*ke…

Elasticsearch实战(二十四)---ES数据建模一对多模型Nested结构

Elasticsearch实战—ES数据建模一对多模型Nested结构 文章目录 Elasticsearch实战---ES数据建模一对多模型Nested结构1.ES 一对多模型Nested 结构模型实战2.ES字段查询2.1 非Nested 错误结构及错误查询2.2 Nested结构&#xff0c;正确查询 3.Nested结构原理 我们如何把Mysql的模…

初步学习使用SpringBoot框架

对于SpringBoot框架介绍大家可以看看这个这篇文章&#xff0c;SpringBoot优缺点以及如何安装使用 以下我是按照老师给的安装方法进行安装使用SpringBoot框架&#xff1a; 大家安装SpringBoot框架时候&#xff0c;最好安装3.0以下的&#xff0c;不然需要对应较高版本的JDK版本&…

快速排序的三路划分方法和归并排序的递归和非递归实现

目录 快速排序的三路划分方法 归并排序的递归实现 归并排序的非递归实现 快速排序的三路划分方法 首先快排的时间复杂度为O(N*logN)&#xff0c;空间复杂度O(logN),不稳定。 三路划分&#xff1a;将数据分为三份&#xff1b;可以提高当数据中出现多个重复数字时的效率。 …

有没有免费提取音频的软件,分享几个给大家!

在日常生活中&#xff0c;我们经常遇到需要从视频中提取音频的情况&#xff0c;无论是为了制作音频片段、录制语音笔记还是进行后期编辑。本文将介绍三种免费提取音频的方法&#xff0c;分别是记灵在线工具、PR&#xff08;Adobe Premiere Pro&#xff09;和剪映。通过这些方法…

【新版系统架构】第九章-软件可靠性基础知识

软考-系统架构设计师知识点提炼-系统架构设计师教程&#xff08;第2版&#xff09; 第一章-绪论第二章-计算机系统基础知识&#xff08;一&#xff09;第二章-计算机系统基础知识&#xff08;二&#xff09;第三章-信息系统基础知识第四章-信息安全技术基础知识第五章-软件工程…

基于Springboot+mybatis+mysql+vue实现企业注册模块功能

基于Springbootmybatismysqlvue实现企业注册模块功能 一、系统介绍二、功能展示1.主页面2.注册成功 三、数据库四、代码展示四、其他系统实现五、获取源码 一、系统介绍 该系统实现简单的企业信息注册&#xff0c;保存后&#xff0c;提示注册成功。 运行环境&#xff1a;idea…

哈希表--day6--总结篇

文章目录 数组作为哈希表set作为哈希表map作为哈希表 一般来说哈希表都是用来快速判断一个元素是否出现集合里。 对于哈希表&#xff0c;要知道哈希函数和哈希碰撞在哈希表中的作用. 哈希函数是把传入的key映射到符号表的索引上。 哈希碰撞处理有多个key映射到相同索引上时的…