Дан массив действительных чисел A[N]. Найти max(a1+a2n, a2+a2n-1,…,an+an+1)

Задача: Дан массив действительных чисел A[N]. Найти max(a1+a2n, a2+a2n-1,…,an+an+1). Так как я совсем зеленый, пробовал сначала написать прямолинейно:

double max = array[0] + array[array.length - 1];
    for (int i = 1; i < array.length; i++) {
        if (max < array[i] + array[array.length*2 - 1]);
        max = array[i] + array[array.length * 2 - 1];
    }

Но в таком примере я скорее всего получу ArrayIndexOutOfBoundsException. Искал ответ в интернете, и наткнулся на следующую реализацию этого примера:

public static int getMaxSum(int[] array) {
    int maxSum = array[0] + array[array.length - 1];
    for (int i = 1; i < array.length / 2; i++) {
        if ((array[i] + array[array.length - i - 1]) > maxSum) {
            maxSum = array[i] + array[array.length - i - 1];
        }

    }
    return maxSum;
}

Тут проблема с ArrayIndexOutOfBoundsException вроде бы решена. Однако я не совсем понимаю принципа:

  • Сокращаем на 2 чтобы не получить исключение?
  • Зачем от длины массива отнимать индекс?

Может кто-нибудь объяснить?


Ответы (1 шт):

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

Чтобы ответить на Ваши вопросы проще всего будет рассмотреть пример. Допустим N=10. Тогда массив будет иметь вид - [a1,a2,a3,a4,a5,a6,a7,a8,a9,a10]. Согласно заданию нам необходимо найти максимальное число из чисел [a1+a10,a2+a9,a3+a8,a4+a7,a5+a6]. Учитывая переместительное свойство сложения в вычислении чисел [a10+a1,a9+a2,a8+a3,a7+a4,a6+a5] нет смысла. Соотвественно нам достаточно пройти в цикле только половину массива N/2 и вычислять позицию второго слагаемого основываясь на длине массива - N-i.

→ Ссылка