Локальный максимум в массиве Java ( используя только массив)
Задача:
Из массива удалить локальные максимумы. (Локальный максимум — это элемент, который больше любого из его соседних элементов.) Задача:
Важно:
Размер данного массива гарантированно больше 1. Данный массив гарантированно не равен null. Если у массива нет локальных максимумов, то вы должны вернуть его копию без изменений. Нужно использовать только массивы
не проходит тест array = new int[1000]; Arrays.fill(array, 15); array[0] = 20; array[999] = 25; array[168] = 30; actual = LocalMaximaRemove.removeLocalMaxima(array);
Мое решение:
import java.util.Arrays;
public class LocalMaximaRemove {
public static void main(String[] args) {
int[] array = new int[]{-3, 2, 4, 13, 5, 12, 8};
System.out.println(Arrays.toString(removeLocalMaxima(array)));
}
public static int[] removeLocalMaxima(int[] array) {
int size = array.length, t = 0;
int[] arr2 = new int[size - 1];
for (int i = 0; i < size - 1; i++) {
if (array[i] < array[i + 1]) {
arr2[t] = array[i];
t++;
}
}
arr2[t] = array[array.length - 1];
if (array[size - 1] < array[size - 2]) {
arr2[t] = array[array.length - 1];
} else {
t--;
}
return Arrays.copyOfRange(arr2, 0, t + 1);
}
}
Ответы (1 шт):
Я бы так сделал
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
final int[] array =
new int[]{1, 3, 5, 6, 4, 2, 0};
System.out.println(Arrays.toString(removeLocalMaxima(array)));
}
private static int[] removeLocalMaxima(int[] array) {
int leftIndex, rightIndex;
for (int i = 1; i < array.length - 1; ) {
leftIndex = correlateLeftIndex(i);
rightIndex = correlateRightIndex(i, array.length - 1);
if (array[leftIndex] <= array[i] && array[i] > array[rightIndex] ||
array[leftIndex] < array[i] && array[i] >= array[rightIndex]) {
array = removeElement(array, i);
i = 0;
} else {
++i;
}
}
return array;
}
private static int correlateLeftIndex(int i) {
return Math.max(i, 0);
}
private static int correlateRightIndex(int i, int max) {
return Math.min(i + 1, max);
}
private static int[] removeElement(int[] array, int removeIndex) {
final int[] newArray =
new int[array.length - 1];
System.arraycopy(array, 0, newArray, 0, removeIndex);
System.arraycopy(array, removeIndex + 1, newArray, removeIndex, array.length - removeIndex - 1);
return newArray;
}
}
В целом, здесь можно только удаление сократить, подключив библиотеку Apache Commons Lang. Он по сути делает такое же самое удаление.
import org.apache.commons.lang3.ArrayUtils;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
final int[] array =
new int[]{1, 3, 5, 6, 4, 2, 0};
System.out.println(Arrays.toString(removeLocalMaxima(array)));
}
private static int[] removeLocalMaxima(int[] array) {
int leftIndex, rightIndex;
for (int i = 0; i < array.length - 1; ) {
leftIndex = correlateLeftIndex(i);
rightIndex = correlateRightIndex(i, array.length - 1);
if (array[leftIndex] <= array[i] && array[i] > array[rightIndex] ||
array[leftIndex] < array[i] && array[i] >= array[rightIndex]) {
array = ArrayUtils.remove(array, i);
i = 0;
} else {
++i;
}
}
return array;
}
private static int correlateLeftIndex(int i) {
return Math.max(i, 0);
}
private static int correlateRightIndex(int i, int max) {
return Math.min(i + 1, max);
}
}