1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| class Solution { func getSkyline(_ buildings: [[Int]]) -> [[Int]] { let n = buildings.count if n == 0 { return [] } if n == 1 { return [[buildings[0][0], buildings[0][2]], [buildings[0][1], 0]] }
let l = getSkyline(Array(buildings[..<(n/2)])) let r = getSkyline(Array(buildings[(n/2)...]))
return merge(l, r) }
private func merge(_ l: [[Int]], _ r: [[Int]]) -> [[Int]] { let ln = l.count, rn = r.count var lp = 0, rp = 0 var curY = 0, lY = 0, rY = 0 , output = [[Int]
func update(_ x: Int, _ y: Int) { if output.isEmpty || output.last?.first != x { output.append([x, y]) } else { output[output.count-1][1] = y } }
func append(_ p: Int, _ lst: [[Int]], _ n: Int, _ curY: Int) { var p = p, curY = curY while p < n { let (x, y) = (lst[p][0], lst[p][1]) p += 1 if curY != y { update(x, y) curY = y } } }
while lp < ln && rp < rn { let lPoint = l[lp], rPoint = r[rp]
var x = 0 if lPoint[0] < rPoint[0] { (x, lY) = (lPoint[0], lPoint[1]) lp += 1 } else { (x, rY) = (rPoint[0], rPoint[1]) rp += 1 }
let maxY = max(lY, rY) if curY != maxY { update(x, maxY) curY = maxY } }
append(lp, l, ln, curY) append(rp, r, rn, curY)
return output } }
|