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

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

4周前 (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自然处理。



原创内容 转载请注明出处

分享给朋友:

相关文章

力扣35:二分法在搜索插入位置中的运用

力扣35:二分法在搜索插入位置中的运用

有序数组的定位在一个严格递增的数字序列中,每个元素都有其确定的位置。当新元素试图加入时,我们需要回答两个问题:它是否已经存在?如果不存在,它应该插入在哪里?这道题要求我们在O(log n)时间内完成这...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

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

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

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

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

牛客3750题解题报告:滑动窗口最大值的高效解法(C++代码详解)

一、题目解读牛客3750题要求在一个给定的整数数组中,计算指定窗口大小下的滑动窗口最大值。例如,输入数组num=[1,3,-1,-3,5,3,6,7],窗口大小为size=3时,需输出每个窗口内的最大...

手搓二叉搜索树代码详解:从入门到实现(附完整注释)

一、简介和应用二叉搜索树(Binary Search Tree,BST)是一种经典的数据结构,其特点在于每个节点的左子树所有节点值均小于该节点,右子树所有节点值均大于该节点。这种特性使得它在查找、插入...

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

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

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

发表评论

访客

看不清,换一张

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