Задачка 01
Ты забыл дать другие граничные условия.
Пихаешь в переменные левую и правую границу первого отрезка, потом ищещь следующий отрезок, если у него сумма больше - то заменяешь границы на новые.
бред
может быть ситуация х х х х 100 50 60 -1 100 200 х х х
и тогда отрезок с присутствующей внутри -1 всё равно имеет сумму больше, чем отдельно 100 50 60 или 100 200
тогда хз
Если да, то можно так:
int max = 0;
bool assigned = false;
int maxStart = 0;
int maxEnd = 0;
int [] b = new int[a.Length];
for (int i = 0; i < a.Length; i++)
{
for (int j = 0; j <= i; j++)
{
b[j] += a[i];
if (!assigned || b[j] > max)
{
max = b[j];
maxStart = j;
maxEnd = i;
assigned = true;
}
}
}
Проход массива a - один
// Местным рюхам: вот только не надо демпинговать, ладно?
Это ты демпингуешь.
обычно ещё добавляют: и без использования дополнительных массивов
Собственно эту фразу я и хотел увидеть от 'а
bool assigned = false;
int max = 0;
int maxStart = 0;
int maxEnd = 0;
int current = 0;
int currentStart = 0;
for (int i = 0; i < a.Length; i++)
{
current += a[i];
if (!assigned || current > max)
{
max = current;
maxStart = currentStart;
maxEnd = i;
assigned = true;
}
if (current < 0)
{
currentStart = i + 1;
current = 0;
}
}
Не работает, если все элементы массива отрицательные.
Работает, проверь
в условии не сказано, может быть результирующая подпоследовательность нулевой длины или нет.
Эту лажовую задачу мне дали на собеседовании в СиБосс 5 лет назад На 6 таких задач давалось полтора часа, насколько я помню
Оставить комментарий
otvertka07
Имеется линейный массив целых чисел.Найти непрерывный интервал, содержащий максимальную сумму.
За один проход.