Локальный максимум в массиве 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 шт):

Автор решения: ulxanxv

Я бы так сделал

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);
    }

}
→ Ссылка