当前位置:首页 > 力扣 > 【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)

2个月前 (06-20)

【力扣3115题解】数组中质数最大差值的求解(C++代码详解)  数组 质数判断 C++代码 第1张


一、题目解读

力扣3115题要求在一个整数数组中,找出两个质数之间的最大差值。若数组不存在质数,则返回0。题目核心在于高效筛选质数,并计算其索引差值的最大值,需兼顾时间与空间复杂度。

二、解题思路

参考代码采用“单次遍历+质数判定优化”策略:

1. 初始化最小质数索引min_prime为INT_MAX,最大质数索引max_prime为-1,标记变量found记录是否找到质数。

2. 遍历数组,调用isPrime()判断当前数是否为质数。

3. 若找到首个质数,更新min_prime和max_prime;后续质数更新时,仅调整两者极值。

4. 最终根据found状态和索引差返回结果。

关键在于通过单次遍历避免重复计算,并利用优化后的质数判断函数减少时间消耗。

三、解题步骤

1. 初始化变量:设置min_prime、max_prime及found。

2. 遍历数组:对每个元素调用isPrime()。

3. 更新索引:

○ 若为质数且未找到首个质数,记录min_prime和max_prime;

○ 若已找到,仅更新极值索引。

4. 计算差值:根据found状态判断是否返回max_prime - min_prime或0。

四、代码及注释

class Solution {
public:
    int maximumPrimeDifference(vector<int>& nums) {
        int min_prime = INT_MAX;  // 记录最小质数的位置
        int max_prime = -1;       // 记录最大质数的位置
        bool found = false;       // 标记是否找到质数
        
        for (int i = 0; i < nums.size(); ++i) {
            if (isPrime(nums[i])) {
                if (!found) {
                    min_prime = i;
                    max_prime = i;
                    found = true;
                } else {
                    if (i < min_prime) min_prime = i;
                    if (i > max_prime) max_prime = i;
                }
            }
        }
        
        return found && (min_prime!= max_prime)? max_prime - min_prime : 0;
    }
    
private:
    bool isPrime(int num) {
        if (num <= 1) return false;          // 非质数
        if (num == 2) return true;           // 特殊处理2
        if (num % 2 == 0) return false;      // 偶数非质数(除2外)
        
        for (int i = 3; i * i <= num; i += 2) {  // 仅检查奇数因子
            if (num % i == 0) return false;
        }
        return true;
    }
};

五、总结

该解法通过单次线性遍历结合高效质数判定,实现O(n√n)时间复杂度。关键在于:

1. 利用标记变量减少分支判断;

2. 质数判定函数通过排除偶数、缩小循环范围优化性能;

3. 边界条件(如空数组、无质数)通过found自然处理。



原创内容 转载请注明出处

分享给朋友:

相关文章

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

汉诺塔问题递归解法(C++代码详解) 牛客4414题解题指南

一、题目解读汉诺塔问题是一个经典的递归算法题目:有n个大小不同的圆盘按从大到小顺序放在柱A上,需借助柱B,将圆盘移至柱C,每次只能移动一个圆盘,且大圆盘不能置于小圆盘之上。牛客4414题要求编写函数输...

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

洛谷1363题解法:虚拟坐标优化BFS解决循环迷宫问题(附代码详解)

一、题目解读洛谷1363题要求判断在给定大小的循环迷宫中,从起点出发是否可以通过移动到达多个不同的路径方向。迷宫由字符矩阵表示,'S'为起点,'#'为障碍物,其余为可通...

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

【1999NOIP普及组】(洛谷P1016)旅行家的预算解题报告(附代码+注释)

一、题目解读题目要求解决旅行家从起点到终点(D1公里)的预算问题,需在沿途N个加油站中规划加油策略,使总费用最小化。每个加油站有不同油价和距离,汽车每升油可行驶D2公里,初始油量为C升,终点无加油站。...

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

LeetCode 2523题解:寻找区间内最小间隔质数对(C++代码)

一、题目解读LeetCode 2523题要求在一个给定的整数区间 [left, right] 内,找到间隔最小的两个质数(即相邻质数的差值最小),并返回这对质数。若区间内不存在两个质数,则返回 [-1...

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

力扣LCR074题区间合并算法解析:贪心排序与区间重叠处理

一、题目解读力扣LCR074题要求对给定的二维区间数组(每个区间由起始点和终止点构成)进行合并,将重叠的区间合并为更宽的区间,最终输出不重叠的合并结果。例如,输入[[1,3],[2,6],[8,10]...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。