Problem : Given an array of n integers. find the max sum while traversing from parent to children when elements are arranged as a pyramid.
For ex: input = [5, 4, 12, 3, 11, 7, 2, 8, 1, 9 ]
index = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]
5
4 12
3 11 7
2 8 1 9
Output : 36
5 + 12 + 11 + 8
valid move: 4 to 3 or 11
invalid move: 4 to 5 / 12 / 7 / 2
Basic idea is that at each level the number of elements are level +1.
Level 0= 1 element
Level 1= 2 elements
Level n-1 = n elements
Level n = n+1 elements.
For an elements its children would be at (index of element + level +1) and (index of an element +2) .
Traverse all levels recursively, find the max among both of its children, add it to the max and pass the new index and level to next recursion. Do this till index+level+2 < array.size.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public long findMaxSum(List<Integer> input) { if(input == null || input.size() < 1){ return 0; } return findMaxSum(input, 0, 0,input.get(0)); } public long findMaxSum(List<Integer> input, int level, int parentIndex, int sum){ if(parentIndex+level+2 < input.size()){ parentIndex = (input.get(parentIndex+level+1) > input.get(parentIndex+level+2)) ? parentIndex+level+1 : parentIndex+level+2; sum = sum + input.get(parentIndex); return findMaxSum(input, ++level, parentIndex, sum); }else{ return sum; } } |
No comments:
Post a Comment