力扣3115题解:数组中质数位置的最大差值算法详解
一、问题描述
给定一个整数数组nums,要求找出数组中所有质数元素的最小位置和最大位置之间的差值。如果数组中只有一个或没有质数,则返回0。
二、解题思路
质数判断:首先需要判断一个数是否为质数
位置记录:遍历数组,记录所有质数元素的位置
差值计算:找出最左和最右质数位置,计算它们的差值
三、完整代码
class Solution { public: int maximumPrimeDifference(vector<int>& nums) { int min_prime = INT_MAX; // 初始化最小位置为最大整数 int max_prime = -1; // 初始化最大位置为-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; } } } // 返回结果:如果有多个质数则返回差值,否则返回0 return found && (min_prime != max_prime) ? max_prime - min_prime : 0; } private: // 质数判断函数 bool isPrime(int num) { if (num <= 1) return false; // 1及以下的数不是质数 if (num == 2) return true; // 2是质数 if (num % 2 == 0) return false; // 排除偶数 // 检查3到sqrt(num)之间的奇数 for (int i = 3; i * i <= num; i += 2) { if (num % i == 0) return false; } return true; } };
四、代码解析
主函数maximumPrimeDifference:
初始化min_prime为INT_MAX,max_prime为-1
遍历数组,使用isPrime函数判断每个元素是否为质数
维护最小和最大质数位置
最后根据条件返回差值或0
辅助函数isPrime:
处理特殊情况:1及以下的数、2、偶数
使用优化方法检查奇数因子,只需检查到√num
原创内容 转载请注明出处