diff --git a/src/main/java/com/thealgorithms/maths/FindKthNumber.java b/src/main/java/com/thealgorithms/maths/FindKthNumber.java index a9b267677eac..138d4b952be9 100644 --- a/src/main/java/com/thealgorithms/maths/FindKthNumber.java +++ b/src/main/java/com/thealgorithms/maths/FindKthNumber.java @@ -1,5 +1,7 @@ package com.thealgorithms.maths; +import java.util.Collections; +import java.util.PriorityQueue; import java.util.Random; /** @@ -62,4 +64,19 @@ private static void swap(int[] array, int i, int j) { array[i] = array[j]; array[j] = temp; } + + public static int findKthMaxUsingHeap(int[] array, int k) { + if (k <= 0 || k > array.length) { + throw new IllegalArgumentException("k must be between 1 and the size of the array"); + } + PriorityQueue maxHeap = new PriorityQueue<>(Collections.reverseOrder()); // using max-heap to store numbers. + for (int num : array) { + maxHeap.add(num); + } + while (k > 1) { + maxHeap.poll(); // removing max number from heap + k--; + } + return maxHeap.peek(); + } } diff --git a/src/test/java/com/thealgorithms/maths/FindKthNumberTest.java b/src/test/java/com/thealgorithms/maths/FindKthNumberTest.java index 21285a527c37..ca69e66c9f6a 100644 --- a/src/test/java/com/thealgorithms/maths/FindKthNumberTest.java +++ b/src/test/java/com/thealgorithms/maths/FindKthNumberTest.java @@ -14,21 +14,30 @@ public void testFindKthMaxTypicalCases() { assertEquals(3, FindKthNumber.findKthMax(array1, 3)); assertEquals(4, FindKthNumber.findKthMax(array1, 2)); assertEquals(5, FindKthNumber.findKthMax(array1, 1)); + assertEquals(3, FindKthNumber.findKthMaxUsingHeap(array1, 3)); + assertEquals(4, FindKthNumber.findKthMaxUsingHeap(array1, 2)); + assertEquals(5, FindKthNumber.findKthMaxUsingHeap(array1, 1)); int[] array2 = {7, 5, 8, 2, 1, 6}; assertEquals(5, FindKthNumber.findKthMax(array2, 4)); assertEquals(6, FindKthNumber.findKthMax(array2, 3)); assertEquals(8, FindKthNumber.findKthMax(array2, 1)); + assertEquals(5, FindKthNumber.findKthMaxUsingHeap(array2, 4)); + assertEquals(6, FindKthNumber.findKthMaxUsingHeap(array2, 3)); + assertEquals(8, FindKthNumber.findKthMaxUsingHeap(array2, 1)); } @Test public void testFindKthMaxEdgeCases() { int[] array1 = {1}; assertEquals(1, FindKthNumber.findKthMax(array1, 1)); + assertEquals(1, FindKthNumber.findKthMaxUsingHeap(array1, 1)); int[] array2 = {5, 3}; assertEquals(5, FindKthNumber.findKthMax(array2, 1)); assertEquals(3, FindKthNumber.findKthMax(array2, 2)); + assertEquals(5, FindKthNumber.findKthMaxUsingHeap(array2, 1)); + assertEquals(3, FindKthNumber.findKthMaxUsingHeap(array2, 2)); } @Test @@ -36,6 +45,8 @@ public void testFindKthMaxInvalidK() { int[] array = {1, 2, 3, 4, 5}; assertThrows(IllegalArgumentException.class, () -> FindKthNumber.findKthMax(array, 0)); assertThrows(IllegalArgumentException.class, () -> FindKthNumber.findKthMax(array, 6)); + assertThrows(IllegalArgumentException.class, () -> FindKthNumber.findKthMaxUsingHeap(array, 0)); + assertThrows(IllegalArgumentException.class, () -> FindKthNumber.findKthMaxUsingHeap(array, 6)); } @Test @@ -43,8 +54,10 @@ public void testFindKthMaxLargeArray() { int[] array = generateArray(1000); int k = new Random().nextInt(1, array.length); int result = FindKthNumber.findKthMax(array, k); + int maxK = FindKthNumber.findKthMaxUsingHeap(array, k); Arrays.sort(array); assertEquals(array[array.length - k], result); + assertEquals(array[array.length - k], maxK); } public static int[] generateArray(int capacity) {