Here is my code inspired by your idea - accepted in 145 ms

class Solution(object):
def getSkyline(self, buildings):
"""
:type buildings: List[List[int]]
:rtype: List[List[int]]
"""
if len(buildings) == 0:
return [ ]
if len(buildings) == 1:
return [ [ buildings[0][0], buildings[0][2]], [buildings[0][1], 0] ]
mid = len(buildings)//2
left = self.getSkyline(buildings[:mid])
right = self.getSkyline(buildings[mid:])
return self.merge(left,right)
def merge(self,left,right):
output = [[0,0]]
i,j,m,n = 0,0,len(left),len(right)
ly,ry = -1,-1
ansx = -1
ansy = -1
while i < m and j < n:
ansx = -1
ansy = -1
if left[i][0] < right[j][0]:
ly = left[i][1]
ansx = left[i][0]
ansy = max(ly,ry)
i += 1
elif left[i][0] > right[j][0]:
ry = right[j][1]
ansx = right[j][0]
ansy = max(ly,ry)
j += 1
elif left[i][0] == right[j][0]:
ly = left[i][1]
ry = right[j][1]
ansx = left[i][0]
ansy = max(ly,ry)
i += 1
j += 1
# ansx - the one that comes first in x-axis
# ansy - the tallest height that is 'overshadowing' current point
if ansx != -1 and output[-1][1] != ansy:
# if the taller point is already dominating, the ansx will not appear in silhouette
output.append( [ ansx, ansy] )
while i < m:
output.append( left[i][:] )
i += 1
while j < n:
output.append( right[j][:])
j += 1
return output[1:]