- 博客主页:音符犹如代码
- 系列专栏:算法练习
- 关注博主,后期持续更新系列文章
- 如果有错误感谢请大家批评指出,及时修改
- 感谢大家点赞👍收藏⭐评论✍
目录
思路
解题方法
时间复杂度
空间复杂度
Code
总结
思路
这道题的解题思路是首先理解题目要求:在给定的整数数组中找到任意两个质数之间的最大距离。为了找到这个最大距离,我们需要遍历数组,同时跟踪遇到的最小质数和最大质数的位置(即下标)。当我们遍历数组时,对于每个元素,我们使用一个辅助函数来判断它是否是质数。如果是质数,我们就更新最小质数和最大质数的位置(如果还没有找到最小质数,就将其设置为当前质数的位置;对于最大质数的位置,我们总是更新为当前质数的位置,因为我们想要找到的是任意两个质数之间的最大距离)。最后,我们返回最大质数和最小质数位置之间的差值作为结果。
方法
-
初始化:设置两个变量
minPrimeIndex
和maxPrimeIndex
为-1,用于跟踪最小质数和最大质数的位置。 -
遍历数组:使用循环遍历给定的整数数组。
-
质数判断:对于数组中的每个元素,使用辅助函数
isPrime
来判断它是否是质数。 -
更新位置:
- 如果当前元素是质数,并且还没有找到最小质数(即
minPrimeIndex
为-1),则更新minPrimeIndex
为当前元素的位置。 - 无论是否已经找到最小质数,都更新
maxPrimeIndex
为当前质数的位置,因为我们想要跟踪遇到过的最大质数的位置。
- 如果当前元素是质数,并且还没有找到最小质数(即
-
返回结果:遍历完数组后,检查
minPrimeIndex
和maxPrimeIndex
的值。如果它们相等(即没有找到质数),则返回0;否则,返回maxPrimeIndex - minPrimeIndex
作为结果。
时间复杂度
时间复杂度主要取决于两个因素:遍历数组和质数判断。
- 遍历数组是线性的,即O(n),其中n是数组的长度。
- 质数判断的时间复杂度在最坏情况下是O(sqrt(m)),其中m是当前要判断的数。但是,由于我们只对数组中的每个元素进行一次质数判断,并且数组的长度是有限的,因此我们可以将质数判断的总体时间复杂度视为与数组长度n成线性关系(尽管实际上是一个更复杂的函数,但在这里我们可以将其简化为与n相关的函数)。
空间复杂度
空间复杂度是O(1),因为我们只使用了几个变量(minPrimeIndex
、maxPrimeIndex
以及isPrime
函数中的几个循环变量)来存储状态,这些变量的数量不随输入数组的大小而变化。我们没有使用任何与输入数组大小成正比的额外空间来存储数据。
Code
class Solution {
public int maximumPrimeDifference(int[] nums) {
int minPrimeIndex = -1; // 记录最小质数的下标
int maxPrimeIndex = -1; // 记录最大质数的下标
for (int i = 0; i < nums.length; i++) {
if (isPrime(nums[i])) {
if (minPrimeIndex == -1) {
minPrimeIndex = i; // 更新最小质数的下标
}
maxPrimeIndex = i; // 更新最大质数的下标(每遇到一个质数就更新)
}
}
// 如果数组中只有一个质数,则最大距离为0
if (minPrimeIndex == maxPrimeIndex) {
return 0;
}
// 返回最大质数和最小质数之间的下标差
return maxPrimeIndex - minPrimeIndex;
}
private boolean isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
}
总结
对于在给定整数数组中找到任意两个质数之间最大距离的问题,上述的直接遍历加状态跟踪的解法通常是最简单且直接的方法。虽然可以探索其他解法或优化思路,但在实际应用中,这些方法的效率和可行性可能因问题的具体条件而异。在没有特定要求或限制的情况下,推荐使用直接且有效的方法来解决问题。