首页 > 其他分享 >LeetCode/和等于目标值的质数对

LeetCode/和等于目标值的质数对

时间:2023-07-02 16:33:06浏览次数:34  
标签:int 质数 LeetCode flag vector 目标值 getprime 合数

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

  • 1 <= x <= y <= n
  • x + y == n
  • x 和 y 都是质数

请你以二维有序列表的形式返回符合题目要求的所有[xi, yi],列表需要按 xi 的非递减顺序排序。如果不存在符合要求的质数对,则返回一个空数组。

1. 埃氏筛预处理

把素数的倍数记为合数,从前往后的情况下
没有被标记的便是素数(即不存在更小的因数)

vector<bool> prime(10e6,true);
bool flag = false;

void getprime(){//埃氏筛预处理
    for(int i=2;i<10e6;i++){
        if(prime[i]==false) continue;
        for(int j=2*i;j<10e6;j=j+i)
            prime[j] = false;
    }
    flag = true;
}

class Solution {
public:
    //可以预处理先把质数筛出来
    vector<vector<int>> findPrimePairs(int n) {
        if(!flag) getprime();
        vector<vector<int>> res;
        for(int i=2;i<=n/2;i++)
            if(prime[i]&&prime[n-i]) res.push_back({i,n-i});
        return res;
    }
};

2. 线性筛

通过固定枚举顺序,减少埃氏筛中的重复筛选
即枚举所有数和所有更小质数的乘积为非素数
但合数与质数的乘积只枚举到该合数的最小质因数,因为之后的乘积会在后面重复枚举,表示为更大的合数和该质因数之积

vector<bool> prime(10e6,true);
vector<int> nums(10e5);//记录所有质数
int cnt = 0;
bool flag = false;

void getprime(){//欧拉筛预处理,关键在于,合数只和比自己质因数更小的质数结合
    for(int i=2;i<10e6;i++){
        if(prime[i]) nums[cnt++] = i;//从前往后记录素数
        for(int j=0;j<cnt && i*nums[j]<10e6;j++){ //枚举所有素数
            prime[i*nums[j]] = false; //素数和素数的乘积,以及合数和素数的乘积,皆为合数
            if(i%nums[j]==0) break; //如果i为素数,会一直枚举, 如果i为合数,枚举到存在它的质数因数,
            //合数与比自己质因数更大的质数乘积时,可以表示为,更小的素数与更大的合数的乘积,所以后面会遍历到,这里避免重复筛选
        }
    } 
    flag = true;
}

class Solution {
public:
    //可以预处理先把质数筛出来
    vector<vector<int>> findPrimePairs(int n) {
        if(!flag) getprime();
        vector<vector<int>> res;
        for(int i=2;i<=n/2;i++)
            if(prime[i]&&prime[n-i]) res.push_back({i,n-i});
        return res;
    }
};

标签:int,质数,LeetCode,flag,vector,目标值,getprime,合数
From: https://www.cnblogs.com/929code/p/17520938.html

相关文章

  • Python 满足列中任意两个数之和等于目标值,输出这两个数的值和所在列表的索引值
    给定一个列表为nums=[2,7,11,15],目标值target=9,找出列表中任意2数之和等于9的元素以及所在位置思路:双重遍历去一对一的比较判断1nums=[2,7,11,15,1,8,2]2target=93list_new=[]4deffind_num_indx():56foriinrange(len(nums)):......
  • LeetCode-Python-#27 移除元素
    题目描述给定一个数列nums和数值val,消除数列nums中与数值 val相同的元素,最终返回新数列的长度;要求:不能开辟空间分配新的数列,必须改变原输入nums数列;并对修改后的nums数列的元素顺序没有要求,可以被修改。Examplesnums=[3,2,2,3; val=3 则返回长度为2;nums=[0,1,2,2,3,0,4,2]......
  • leetcode集训
    设定目标:在开始做题之前,设定一个明确的目标是很重要的。你可以考虑设定一个每日或每周的目标,例如解决一定数量的问题,提高通过率等。理解问题:在开始解题之前,确保你完全理解了题目要求和限制条件。仔细阅读问题描述,明确输入和输出的格式,以及特定的边界情况。思考不同的解决方法:对于每......
  • LeetCode-146-LRU缓存
    146题:LRU缓存题目请你设计并实现一个满足 LRU(最近最少使用)缓存约束的数据结构。实现LRUCache类:LRUCache(intcapacity)以正整数作为容量 capacity初始化LRU缓存intget(intkey)如果关键字key存在于缓存中,则返回关键字的值,否则返回-1。voidput(intke......
  • [刷题记录Day1]Leetcode列表专题
    No.1题目二分查找思路要素:原数组升序排列清楚地定义左右边界优化空间:数组有序,通过第0元素和最后元素,可以避免查找不在数组范围内的target代码publicstaticintsearch(int[]nums,inttarget){//避免target小于nums[0],大于nums[nums.length-1]时参与运算......
  • 【leetcode】【234】【回文链表】
    c++第一个方法#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}Li......
  • [刷题记录Day3]Leetcode链表专题
    #ListNodedefinitionpublicclassListNode{//结点的值intval;//下一个结点ListNodenext;//节点的构造函数(无参)publicListNode(){}//节点的构造函数(有一个参数)publicListNode(intval){this.val=val;......
  • 【leetcode】【206】【反转链表】
    c++第一个方法#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}Li......
  • 【leetcode】【83】【移除链表元素】
    c++第一个方法#include<algorithm>#include<iostream>#include<memory>#include<vector>//Definitionforsingly-linkedlist.structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}Li......
  • LeetCode 142. 环形链表 II
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode(intx):val(x),next(NULL){}*};*/classSolution{public:ListNode*detectCycle(ListNode*head){if(!head)return......