53. Maximum Subarray
Решение задачи 53 “Максимальный подмассив” с LeetCode.
Условие задачи
Дан массив nums целых чисел. Необходимо найти непрерывная подмассив ( содержащий хотя бы один элемент), сумма элементов которого маскимальна – и вернуть эту сумму.
пример
Input: [-2,1,-3,4,-1,2,1,-5,4],
Output: 6
Объяснение: [4,-1,2,1] имеет максимальную сумму = 6.Решение
Грубой силой
Если массив пустой, то сумма равна нулю.
Если массив из одного элемента – значение этого элемента и есть максимальная сумма.
Идея простая - завести переменную в которой хранить значение максимальной суммы ( для начала присвоить значения первого элемента ).
Теперь запускаем первый цикл от 0 элемента до конца массива(итератор idx).
Присваиваем переменной sum нуль. В этой переменной будет хранить значение текущей суммы.
Запускаем второй цикл: от текущего элемента до конца массива ( итераторв jdx. Добавляем значение nums[jdx] к текущей сумму sum. Сравниваем текущую сумму с максимальной суммой – если текущая сумма больше, то присваиваем значние текущей суммы в максимальную.
Таким образом мы подсчитает сумму значений всех возможных подмассивов.
func maxSubArray(nums []int) int {
if len(nums)==0 {
return 0
}
if len(nums)==1 {
return nums[0]
}
maxsum:=nums[0]
for idx:=0;idx<len(nums)-1;idx++ {
sum:=0
for jdx:=idx;jdx<len(nums)-1;jdx++ {
sum += nums[jdx]
if sum>maxsum{
maxsum = sum
}
}
}
return maxsum
}Жадный алгоритм
Идея жадного алгоритма :
- пройтись по массиву
- сверять текущий элемент с суммой
sumи текущего элемента - если сумма больше, то добавить в
sumзначение текущего элемента - если сумма меньше, то присвоить в
sumтекущий элемент - сравнить
sumиmaxsum( еслиmaxsumменьшеsum- записать значниеsumвmaxsum)
func maxSubArray(nums []int) int {
if len(nums)==0 {
return 0
}
maxsum := nums[0]
sum := nums[0]
for idx:=1;idx<len(nums);idx++ {
if nums[idx]> sum + nums[idx] {
sum = nums[idx]
} else {
sum += nums[idx]
}
if sum>maxsum{
maxsum = sum
}
}
return maxsum
}