From a1703430afc2d48a30603536e50da234dbd229bc Mon Sep 17 00:00:00 2001 From: Vicky Maulana Date: Fri, 7 Mar 2025 16:08:05 +0700 Subject: [PATCH 1/2] lc: add solution for finding closest prime numbers in a range --- .../leetcode/ClosestPrimeNumbersInRange.java | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/main/java/com/thealgorithms/leetcode/ClosestPrimeNumbersInRange.java diff --git a/src/main/java/com/thealgorithms/leetcode/ClosestPrimeNumbersInRange.java b/src/main/java/com/thealgorithms/leetcode/ClosestPrimeNumbersInRange.java new file mode 100644 index 000000000000..889c28206463 --- /dev/null +++ b/src/main/java/com/thealgorithms/leetcode/ClosestPrimeNumbersInRange.java @@ -0,0 +1,70 @@ +package com.thealgorithms.leetcode; + +import java.util.Arrays; + +public class ClosestPrimeNumbersInRange { + public int[] closestPrimes(int left, int right) { + // get all primes up to right + boolean[] isPrime = sieveOfEratosthenes(right); + + // first two primes in range + int first = -1; + int second = -1; + + int minDiff = Integer.MAX_VALUE; + int prev = -1; + + for (int i = Math.max(2, left); i <= right; i++) { + if (isPrime[i]) { + if (prev == -1) { + prev = i; + } else { + int diff = i - prev; + if (diff < minDiff) { + minDiff = diff; + first = prev; + second = i; + } + prev = i; + } + } + } + + return first == -1 ? new int[]{-1, -1} : new int[]{first, second}; + } + + public boolean isPrime(int n) { + if (n <= 1) return false; + if (n <= 3) return true; + if (n % 2 == 0 || n % 3 == 0) return false; + + // check for prime by testing divisors up to square root of n, can skip even numbers + // and optimize by checking only numbers of form 6k + 1 + for (int i = 5; i * i <= n; i+= 6) { + if (n % i == 0 || n % (i + 2) == 0) { + return false; + } + } + + return true; + } + + // helper method to find prime numbers using sieve of eratosthenes + public static boolean[] sieveOfEratosthenes(int n) { + boolean[] isPrime = new boolean[n+1]; + 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; + } +} + +// https://leetcode.com/problems/closest-prime-numbers-in-range/description/ From 4256d1af52e19c4dc87b088364772ef8c471abb1 Mon Sep 17 00:00:00 2001 From: electyrion Date: Fri, 7 Mar 2025 09:08:53 +0000 Subject: [PATCH 2/2] Update directory --- DIRECTORY.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index b7f2a8e86564..b134176d83fc 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -354,6 +354,8 @@ * [StockProfitCalculator](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/greedyalgorithms/StockProfitCalculator.java) * io * [BufferedReader](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/io/BufferedReader.java) + * leetcode + * [ClosestPrimeNumbersInRange](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/leetcode/ClosestPrimeNumbersInRange.java) * lineclipping * [CohenSutherland](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/lineclipping/CohenSutherland.java) * [LiangBarsky](https://github.com/TheAlgorithms/Java/blob/master/src/main/java/com/thealgorithms/lineclipping/LiangBarsky.java)