#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. Он не может быть в середине. Представьте, что это так, тогда сумма соседнего элемента либо нечетная, либо четная, если она четная, мы добавляем оба элемента в подмассив, в противном случае один из них четный, и мы добавляем его в подмассив. Мы можем делать это до тех пор, пока не встретим границу с той или иной стороны.
3. Представленный вами случай будет работать нормально. он найдет оба,
1
как можно ближе к границе, но первый1
ближе, поэтому результат будет1, 2, 2, 2, 2
таким, как вы ожидаете.4. возможно, я вас не совсем понял… Но для
{1, 1, 1, 2, 2, 2, 2 ,2}
это не сработает, верно?5. Этот массив уже нечетный, поэтому в первой строке моего сообщения это ответ, который вам нужен.