Как найти самый длинный подмассив с нечетной суммой в заданном целочисленном массиве? (Наиболее эффективным способом)

#java #arrays #time-complexity

#java #массивы #временная сложность

Вопрос:

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

Я пытался обойти массив с помощью цикла while и двух переменных для индексов (low, high while (low <= high) …), но я не каждый раз получал хорошие ответы…

Я пробовал это: (сумма — это общая сумма массива)

 while (low <= high) {

            if((sum - a[low]) % 2 != 0)
                return (high - low);

            else if((sum - a[high]) % 2 != 0)
                return (high - low);

            else{
                if((sum - a[low]) % 2 == 0){
                    sum -= a[low];
                    low  ;
                }

                if((sum - a[high]) % 2 == 0){
                    sum -= a[high];
                    high--;
                }
            }
        }
  

Для {2, 2, 2, 1, 1, 2, 2, 2, 2} я бы ожидал вывода 5
но я получаю 2

Комментарии:

1. Либо вы неправильно поняли проблему, либо ваш входной образец неверен

2. 1 2 2 2 2 = 9 ( нечетный) и длина 5.

3. @NiVeR Отредактировано, я этого не видел.

Ответ №1:

  1. Если весь массив нечетный, то вы его получили.
  2. Если он четный, вам нужно найти четное число, ближайшее к концу массива.
    • Если это число близко к началу, то результатом является подмассив от следующей позиции до конца
    • если это число близко к концу, то результатом является подмассив от начала до этого числа (исключая само число).

Комментарии:

1. Что, если подмассив находится в середине массива? что, если это похоже на ввод, который я дал? Я не уверен, охватывает ли он каждый случай

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

3. Представленный вами случай будет работать нормально. он найдет оба, 1 как можно ближе к границе, но первый 1 ближе, поэтому результат будет 1, 2, 2, 2, 2 таким, как вы ожидаете.

4. возможно, я вас не совсем понял… Но для {1, 1, 1, 2, 2, 2, 2 ,2} это не сработает, верно?

5. Этот массив уже нечетный, поэтому в первой строке моего сообщения это ответ, который вам нужен.