📌 Задача leetcode. Sum of Subarray Minimums



Сложность: Средняя



Задача: Дан массив целых чисел, необходимо посчитать сумму минимумов подмассивов, ответ может быть большим, необходимо посчитать результат по модулю 10^9 + 7.



Пример:



Ввод:
arr = [3,1,2,4]

Вывод: 17



Примечание:

Подмассивы: [3], [1], [2], [4], [3,1], [1,2], [2,4], [3,1,2], [1,2,4], [3,1,2,4], минимумы этих подмассивов: 3, 1, 2, 4, 1, 1, 2, 1, 1, 1, которые в сумме дают 17.



Решение:



func sumSubarrayMins(arr []int) int {

out := 0

var st stack

st.push(-1) // setting left bound



for i := range arr {

for len(st) > 1 && arr[i] <= arr[st.peak()] {

idx := st.pop()

out += (i - idx) * (idx - st.peak()) * arr[idx]

}

st = append(st, i)

}



for len(st) > 1 {

idx := st.pop()

out += (len(arr) - idx) * (idx - st.peak()) * arr[idx]

}



return out % 1000000007

}



type stack []int

func (s *stack) push(v int) {

*s = append(*s, v)

}

func (s *stack) pop() int {

v := (*s)[len(*s)-1]

*s = (*s)[:len(*s)-1]

return v

}

func (s *stack) empty() bool {

return len(*s) == 0

}

func (s *stack) peak() int {

v := (*s)[len(*s)-1]

return v

}



Пишите свое решение в комментариях👇



@golang_interview