Максимальная сумма подмассива размера k
Условие задачи
Дан массив положительных чисел и положительное число k. Найдите максимальную сумму среди всех непрерывных подмассивов размера k.
Пример 1:
1
2
3
Вход: [2, 1, 5, 1, 3, 2], k=3
Выход: 9
Пояснение: максимальную сумму имеет подмассив [5, 1, 3].
Пример 2:
1
2
3
Вход: [2, 3, 4, 1, 5], k=2
Выход: 7
Пояснение: максимальную сумму имеет подмассив [3, 4].
Решение
В полном переборе можно начинать с каждого индекса и складывать следующие k элементов. Его временная сложность равна \(O(N \cdot k)\).
Более эффективное решение использует сумму предыдущего окна размера k. Чтобы сдвинуть окно на один элемент вправо, нужно:
- Прибавить новый элемент, вошедший в окно.
- Вычесть первый элемент предыдущего окна, который из него вышел.
Так мы не вычисляем сумму пересекающейся части двух соседних окон повторно.
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
package main
import "fmt"
func findMaxSumSubarray(k int, arr []int) int {
if k <= 0 || k > len(arr) {
return 0
}
windowSum := 0
maxSum := 0
windowStart := 0
for windowEnd, value := range arr {
windowSum += value
if windowEnd >= k-1 {
if windowStart == 0 || windowSum > maxSum {
maxSum = windowSum
}
windowSum -= arr[windowStart]
windowStart++
}
}
return maxSum
}
func main() {
fmt.Println("Максимальная сумма подмассива размера k:", findMaxSumSubarray(3, []int{2, 1, 5, 1, 3, 2}))
fmt.Println("Максимальная сумма подмассива размера k:", findMaxSumSubarray(2, []int{2, 3, 4, 1, 5}))
}
Вывод:
1
2
Максимальная сумма подмассива размера k: 9
Максимальная сумма подмассива размера k: 7
Временная сложность
Временная сложность алгоритма равна \(O(N)\), где \(N\) — количество элементов массива.
Пространственная сложность
Алгоритм использует постоянный объём дополнительной памяти, поэтому пространственная сложность равна \(O(1)\).