Skip to content

3115. Maximum Prime Difference 👍

  • Time: $O(n)$
  • Space: $O(100) = O(1)$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
 public:
  int maximumPrimeDifference(vector<int>& nums) {
    constexpr int kMax = 100;
    const vector<bool> isPrime = sieveEratosthenes(kMax + 1);
    int minPrimeIndex = -1;
    int maxPrimeIndex = -1;

    for (int i = 0; i < nums.size(); ++i)
      if (isPrime[nums[i]]) {
        if (minPrimeIndex == -1)
          minPrimeIndex = i;
        maxPrimeIndex = i;
      }

    return maxPrimeIndex - minPrimeIndex;
  }

 private:
  vector<bool> sieveEratosthenes(int n) {
    vector<bool> isPrime(n, true);
    isPrime[0] = false;
    isPrime[1] = false;
    for (int i = 2; i * i < n; ++i)
      if (isPrime[i])
        for (int j = i * i; j < n; j += i)
          isPrime[j] = false;
    return isPrime;
  }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class Solution {
  public int maximumPrimeDifference(int[] nums) {
    final int kMax = 100;
    boolean[] isPrime = sieveEratosthenes(kMax + 1);
    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;
      }

    return maxPrimeIndex - minPrimeIndex;
  }

  private boolean[] sieveEratosthenes(int n) {
    boolean[] isPrime = new boolean[n];
    Arrays.fill(isPrime, true);
    isPrime[0] = false;
    isPrime[1] = false;
    for (int i = 2; i * i < n; ++i)
      if (isPrime[i])
        for (int j = i * i; j < n; j += i)
          isPrime[j] = false;
    return isPrime;
  }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
  def maximumPrimeDifference(self, nums: list[int]) -> int:
    kMax = 100
    isPrime = self._sieveEratosthenes(kMax + 1)
    minPrimeIndex = -1
    maxPrimeIndex = -1

    for i, num in enumerate(nums):
      if isPrime[num]:
        if minPrimeIndex == -1:
          minPrimeIndex = i
        maxPrimeIndex = i

    return maxPrimeIndex - minPrimeIndex

  def _sieveEratosthenes(self, n: int) -> list[bool]:
    isPrime = [True] * n
    isPrime[0] = False
    isPrime[1] = False
    for i in range(2, int(n**0.5) + 1):
      if isPrime[i]:
        for j in range(i * i, n, i):
          isPrime[j] = False
    return isPrime