Here is my try at the java solution:
public static int trappingRainWater(List elevations) {
int[] leftToRight = new int[elevations.size()];
int[] rightToLeft = new int[elevations.size()];
int trapped = 0;
leftToRight[0] = elevations.get(0);
for(int i = 1; i < elevations.size(); i++) {
leftToRight[i] = Math.max(leftToRight[i-1], elevations.get(i));
}
rightToLeft[elevations.size() - 1] = elevations.get(elevations.size() - 1);
for(int i = elevations.size() - 2; i>=0; i–)
rightToLeft[i] = Math.max(rightToLeft[i+1], elevations.get(i));
for(int i = 0; i < elevations.size(); i++)
trapped += Math.min(leftToRight[i], rightToLeft[i]) - elevations.get(i);
return trapped;
}