Medium
Given an array arr
of positive integers, consider all binary trees such that:
0
or 2
children;arr
correspond to the values of each leaf in an in-order traversal of the tree.Among all possible binary trees considered, return the smallest possible sum of the values of each non-leaf node. It is guaranteed this sum fits into a 32-bit integer.
A node is a leaf if and only if it has zero children.
Example 1:
Input: arr = [6,2,4]
Output: 32
Explanation: There are two possible trees shown. The first has a non-leaf node sum 36, and the second has non-leaf node sum 32.
Example 2:
Input: arr = [4,11]
Output: 44
Constraints:
2 <= arr.length <= 40
1 <= arr[i] <= 15
import java.util.ArrayDeque
import java.util.Deque
class Solution {
fun mctFromLeafValues(arr: IntArray): Int {
var res = 0
val st: Deque<Int> = ArrayDeque()
st.push(Int.MAX_VALUE)
for (num in arr) {
// do until the present num is bigger than nums in stack (we need to maintain the
// increasing order in stack (bottom to up))
while (st.peek() <= num) {
// find two smallest leafs (integer on top of stack is smallest and at bottom is
// largest UPTIL NOW)
// the next smaller leaf could either be present num or the
val smallestLeaf = st.pop()
val smallerLeaf = Math.min(st.peek(), num)
// num on top of stack after above pop()
// multiply minimum leafs to reduce the SUM
res += smallestLeaf * smallerLeaf
}
st.push(num)
}
// if the size is 2 or less we do not to worry because we have already used it in above step
// since 1st num we added was Integer.MAX, and we do not need to use that, so just do this
// step if the size > 2 (basically there are at least 2 elements from the array)
while (st.size > 2) {
val smallestLeaf = st.pop()
val smallerLeaf = st.peek()
res += smallestLeaf * smallerLeaf
}
return res
}
}