2017-02-08 2 views
0

Требование состоит в том, что ввод будет установлен в диапазоне от -5 до 5, результат должен дать самое длинное подмножество целого числа, в котором общее значение должно быть больше или равно нулю.Как сделать время выполнения программы равным Θ n

Я могу только придумать следующее: вход будет вход [0 до п]

let start, longestStart, end, longestEnd, sum = 0 

for i=0 to n-1 
start = i 
sum = input[i] 
    for j=1 to n 
    if sum + input[j] >= 0 then 
    end=j; 
    if end - start > longestEnd - longestStart then 
    longestStart = start; 
    longestEnd = end; 

Однако это Θ (п^2). Я хотел бы знать, каковы способы, чтобы сделать этот цикл стал Θ (п) Спасибо вам

ответ

0

С

a - b == (a + n) - (b + n) 

для любого а, б или п, мы можем применить это массив чисел , сохраняя общее количество всех элементов от 0 до текущего. Из приведенного выше уравнения сумма любого подматрицы от индекса a до b равна сумме (элементы 0-b) - sum (элементы 0-a).

Путем отслеживания локальных минимумов и максимумов и сумм к ним вы можете найти подмашину с наибольшим диапазоном за один проход, то есть O (n).

+0

Благодарим вас за ответ. Я все еще немного смущен. Если у меня есть вход с [1, 2, 3, -5, 4, 3, -1], и сумма этого массива равна [1, 3, 6, 1, 5, 8, 7]. Очевидно, что весь массив является самым длинным подмассивом, но как его получить с помощью локальных минимумов и максимумов? – swordgit

+0

@swordgit: для вашего примера не весь массив, на который вы ищете ответ? Вы задавали самое длинное подмножество целого числа, сумма которого больше или равна нулю. –

Смежные вопросы