Merge pull request #16018 from Imranalam28/master
[BAEL-7527] Find Peak Elements of a List
This commit is contained in:
commit
0248e55803
|
@ -0,0 +1,40 @@
|
|||
package com.baeldung.peakelements;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class MultiplePeakFinder {
|
||||
|
||||
public static List<Integer> findPeaks(int[] arr) {
|
||||
|
||||
List<Integer> peaks = new ArrayList<>();
|
||||
|
||||
if (arr == null || arr.length == 0) {
|
||||
return peaks;
|
||||
}
|
||||
findPeakElements(arr, 0, arr.length - 1, peaks, arr.length);
|
||||
return peaks;
|
||||
}
|
||||
|
||||
private static void findPeakElements(int[] arr, int low, int high, List<Integer> peaks, int length) {
|
||||
|
||||
if (low > high) {
|
||||
return;
|
||||
}
|
||||
|
||||
int mid = low + (high - low) / 2;
|
||||
|
||||
boolean isPeak = (mid == 0 || arr[mid] > arr[mid - 1]) && (mid == length - 1 || arr[mid] > arr[mid + 1]);
|
||||
boolean isFirstInSequence = mid > 0 && arr[mid] == arr[mid - 1] && arr[mid] > arr[mid + 1];
|
||||
|
||||
if (isPeak || isFirstInSequence) {
|
||||
|
||||
if (!peaks.contains(arr[mid])) {
|
||||
peaks.add(arr[mid]);
|
||||
}
|
||||
}
|
||||
|
||||
findPeakElements(arr, low, mid - 1, peaks, length);
|
||||
findPeakElements(arr, mid + 1, high, peaks, length);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
package com.baeldung.peakelements;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class PeakElementFinder {
|
||||
public List<Integer> findPeakElements(int[] arr) {
|
||||
int n = arr.length;
|
||||
List<Integer> peaks = new ArrayList<>();
|
||||
|
||||
if (n == 0) {
|
||||
return peaks;
|
||||
}
|
||||
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (isPeak(arr, i, n)) {
|
||||
peaks.add(arr[i]);
|
||||
}
|
||||
|
||||
while (i < n - 1 && arr[i] == arr[i + 1]) {
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
return peaks;
|
||||
}
|
||||
|
||||
private boolean isPeak(int[] arr, int index, int n) {
|
||||
if (index == 0) {
|
||||
return n > 1 ? arr[index] >= arr[index + 1] : true;
|
||||
} else if (index == n - 1) {
|
||||
return arr[index] >= arr[index - 1];
|
||||
} else if (arr[index] == arr[index + 1] && arr[index] > arr[index - 1]) {
|
||||
int i = index;
|
||||
|
||||
while (i < n - 1 && arr[i] == arr[i + 1]) {
|
||||
i++;
|
||||
}
|
||||
return i == n - 1 || arr[i] > arr[i + 1];
|
||||
} else {
|
||||
return arr[index] >= arr[index - 1] && arr[index] >= arr[index + 1];
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package com.baeldung.peakelements;
|
||||
|
||||
import java.util.OptionalInt;
|
||||
|
||||
public class SinglePeakFinder {
|
||||
public static OptionalInt findSinglePeak(int[] arr) {
|
||||
int n = arr.length;
|
||||
|
||||
if (n < 2) {
|
||||
return n == 0 ? OptionalInt.empty() : OptionalInt.of(arr[0]);
|
||||
}
|
||||
|
||||
if (arr[0] >= arr[1]) {
|
||||
return OptionalInt.of(arr[0]);
|
||||
}
|
||||
|
||||
for (int i = 1; i < n - 1; i++) {
|
||||
if (arr[i] >= arr[i - 1] && arr[i] >= arr[i + 1]) {
|
||||
return OptionalInt.of(arr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
if (arr[n - 1] >= arr[n - 2]) {
|
||||
return OptionalInt.of(arr[n - 1]);
|
||||
}
|
||||
|
||||
return OptionalInt.empty();
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,23 @@
|
|||
package com.baeldung.peakelements;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class MultiplePeakFinderUnitTest {
|
||||
|
||||
@Test
|
||||
void findPeaks_givenArrayOfIntegers_whenValidInput_thenReturnsCorrectPeaks() {
|
||||
MultiplePeakFinder finder = new MultiplePeakFinder();
|
||||
int[] array = {1, 13, 7, 0, 4, 1, 4, 45, 50};
|
||||
List<Integer> peaks = finder.findPeaks(array);
|
||||
|
||||
assertEquals(3, peaks.size());
|
||||
assertTrue(peaks.contains(4));
|
||||
assertTrue(peaks.contains(13));
|
||||
assertTrue(peaks.contains(50));
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,46 @@
|
|||
package com.baeldung.peakelements;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.*;
|
||||
|
||||
public class PeakElementFinderUnitTest {
|
||||
|
||||
@Test
|
||||
void findPeakElement_givenArrayOfIntegers_whenValidInput_thenReturnsCorrectPeak() {
|
||||
PeakElementFinder finder = new PeakElementFinder();
|
||||
int[] array = {1, 2, 3, 2, 1};
|
||||
List<Integer> peaks = finder.findPeakElements(array);
|
||||
assertEquals(1, peaks.size());
|
||||
assertTrue(peaks.contains(3));
|
||||
}
|
||||
|
||||
@Test
|
||||
void findPeakElement_givenArrayOfIntegers_whenNoPeaks_thenReturnsEmptyList() {
|
||||
PeakElementFinder finder = new PeakElementFinder();
|
||||
int[] array = {};
|
||||
List<Integer> peaks = finder.findPeakElements(array);
|
||||
assertEquals(0, peaks.size());
|
||||
}
|
||||
|
||||
@Test
|
||||
void findPeakElement_givenArrayOfIntegers_whenPeaksAtExtremes_thenReturnsCorrectPeak() {
|
||||
PeakElementFinder finder = new PeakElementFinder();
|
||||
int[] array = {5, 2, 1, 3, 4};
|
||||
List<Integer> peaks = finder.findPeakElements(array);
|
||||
assertEquals(2, peaks.size());
|
||||
assertTrue(peaks.contains(5));
|
||||
assertTrue(peaks.contains(4));
|
||||
}
|
||||
|
||||
@Test
|
||||
void findPeakElement_givenArrayOfIntegers_whenPlateaus_thenReturnsCorrectPeak() {
|
||||
PeakElementFinder finder = new PeakElementFinder();
|
||||
int[] array = {1, 2, 2, 2, 3, 4, 5};
|
||||
List<Integer> peaks = finder.findPeakElements(array);
|
||||
assertEquals(1, peaks.size());
|
||||
assertTrue(peaks.contains(5));
|
||||
}
|
||||
}
|
|
@ -0,0 +1,32 @@
|
|||
package com.baeldung.peakelements;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import org.junit.jupiter.api.Test;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
import java.util.OptionalInt;
|
||||
|
||||
public class SinglePeakFinderUnitTest {
|
||||
|
||||
@Test
|
||||
void findSinglePeak_givenArrayOfIntegers_whenValidInput_thenReturnsCorrectPeak() {
|
||||
int[] arr = {0, 10, 2, 4, 5, 1};
|
||||
OptionalInt peak = SinglePeakFinder.findSinglePeak(arr);
|
||||
assertTrue(peak.isPresent());
|
||||
assertEquals(10, peak.getAsInt());
|
||||
}
|
||||
|
||||
@Test
|
||||
void findSinglePeak_givenEmptyArray_thenReturnsEmptyOptional() {
|
||||
int[] arr = {};
|
||||
OptionalInt peak = SinglePeakFinder.findSinglePeak(arr);
|
||||
assertTrue(peak.isEmpty());
|
||||
}
|
||||
|
||||
@Test
|
||||
void findSinglePeak_givenEqualElementArray_thenReturnsCorrectPeak() {
|
||||
int[] arr = {-2, -2, -2, -2, -2};
|
||||
OptionalInt peak = SinglePeakFinder.findSinglePeak(arr);
|
||||
assertTrue(peak.isPresent());
|
||||
assertEquals(-2, peak.getAsInt());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue