Максимальную разность в массиве


Поддерживать минимальный и максимальный разница, как мы сканируем входной массив.

public static int maxDifference(int[] input){
    int maxDifference = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
    for(int i = 0 ; i < input.length; i++){
      if(input[i]-min > maxDifference){
        maxDifference = input[i]-min;
      }
      if(input[i] < min){
        min = input[i];
      }
    }
    return maxDifference == Integer.MIN_VALUE ? -1 : maxDifference;
  }


835
-1
задан 28 марта 2018 в 03:03 Источник Поделиться
Комментарии
1 ответ

Ваша постановка вопроса не вполне ясно, на момент написания этого ответа. На основе, как я понял, вашей реализации я предполагаю, что вы хотите найти наибольшее возможное различие между 2 входных значений, который является таким же, как, например, разница между наименьшим и наибольшим значением.

Прежде всего, существует довольно очевидная ошибка в коде. Посмотрим, что произойдет на этот вход: [2,3,1]. Как я интерпретировал вопрос, это должно вернуть 2 (т. е. 3-1=2), но ваш код возвращает 1, Вы можете сказать, почему?


Я предпочитаю начать с проверки входных данных и обработки крайних случаях. Предполагая, что вы хотите вернуться -1 если входные данные не иметь по крайней мере 2 цифры, которые вы могли бы начать с этого заявления:

public static int maxDifference(int[] input){
if(input.length < 2) return -1;

Этак мы уверены, что с этого момента будет как минимум 2 числа во входных данных.
Поскольку мы едем все числа во входных данных и плевать индекса мы можем использовать оператор foreach вместо нормального для: for(int next : input){.
Что же касается собственно алгоритма, это делает намного больше смысла для меня, чтобы просто найти min и max значения, идя по списку и посчитать разницу потом.

    for(int next : input){
if(next > max){
max = next;
}
if(next < min){
min = next;
}
}
return max - min;

Это также исправляет ошибку я уже упоминал ранее.
Осталось только инициализация min и max значения. Я настоятельно рекомендую делать это хотя в отдельных строках:

int max = Integer.MIN_VALUE;
int min = Integer.MAX_VALUE;


С этим есть еще один, последний баг исправить, но я оставлю это до вас (поскольку комментарий код фактически о пересмотре рабочий код, а не исправление ошибок).
Я дам тебе 2 подсказки найди ошибку:

public static void main(String[] args) {
int[] input = {Integer.MIN_VALUE, Integer.MAX_VALUE};
System.out.println(maxDifference(input));
}

Почему это выведите -1? И что произойдет, если вы замените Integer.Min_Value С -2 например?

0
ответ дан 29 марта 2018 в 06:03 Источник Поделиться