Aj' postavi svoj primer sa rekurzijom, posto sam slab sa njom totalno?
Није (вам) занимљиво ако дам код који се извршава.
Рецимо да се ово већ довољно дуго вуче да би могао да иде опис. Џиз, дође ми да вас више не гњавим...
Основна идеја са врховима је да се нађу два највиша у целом низу (O(
n)). Онда се обради све између њих (O(
n)). Након тога се преостали делови низа (лево и десно од обрађеног дела) обраде на исти начин. У рекурзивној верзији то изгледа овако:
1. Метода добија низ (arr) и опсег индекса на којем треба да га обради (start / end, start <= end). На почетку важи start = 0, end = arr.len - 1. Метода такође на почетку игнорише случајеве када се одмах види да добијени опсег не може да има запремину. Нпр. start == end, start +1 == end.
2. Запремина volume за тај позив се поставља на нулу.
3. Нађу се прва два максимума himax и lomax. Сваки од њих може бити леви или десни. Нека је индекс левог lmaxi, а индекс десног rmaxi.
4. Сабере се сва запремина између њих и смести се у volume.
5. На променљиву volume се онда додају резултати позива solve(arr, start, lmaxi) и solve(arr, rmaxi, end).
6. Врати се вредност volume.
И меморијска и временска сложеност су O(
n),
Итеративна варијанта ради исто, само што не користи рекурзију како би "паковала" оно што јој је преостало да обради, већ партиционише низ тако што одржава ред интервала које још није обишла и врши обраду све док је ред непразан. Измена није радикална, али претпоставио сам да је лакше прво написати рекурзивно па прерадити у итеративно решење.
Отворено питање је да ли алгоритам може да се унапреди тако да му треба мање од O(n) меморије...