九章算法 | 谷歌面试题:大楼轮廓

水平面上有 N 座大楼,每座大楼都是矩阵的形状,可以用一个三元组表示 (start, end, height),分别代表其在x轴上的起点,终点和高度。大楼之间从远处看可能会重叠,求出 N 座大楼的外轮廓线。

外轮廓线的表示方法为若干三元组,每个三元组包含三个数字 (start, end, height),代表这段轮廓的起始位置,终止位置和高度。

在线评测地址:LintCode 领扣

样例1

输入:
[
    [1, 3, 3],
    [2, 4, 4],
    [5, 6, 1]
]
输出:
[
    [1, 2, 3],
    [2, 4, 4],
    [5, 6, 1]
]
说明:
建筑物如下图所示,黄色部分表示建筑物

v2-9ab1e253c16723e1c09a083506586362_b.jpg

样例2

输入:
[
    [1, 4, 3],
    [6, 9, 5]
]
输出:
[
    [1, 4, 3],
    [6, 9, 5]
]
说明:
建筑物如下图所示,黄色部分表示建筑物

v2-2e3443984754ec2600c4992a2e3a977e_b.jpg

【题解】

使用九章算法强化班中讲过的 HashHeap 和扫描线算法。 Java 可以用 TreeSet / TreeMap, C++ 可以用 Map.

import java.util.*;


public class Solution {
     


  class HashHeap {
     
    ArrayList<Integer> heap;
    String mode;
    int size_t;
    HashMap<Integer, Node> hash;


    class Node {
     
      public Integer id;
      public Integer num;


      Node(Node now) {
     
        id = now.id;
        num = now.num;
      }


      Node(Integer first, Integer second) {
     


        this.id = first;
        this.num = second;
      }
    }


    public HashHeap(String mod) {
     
      // TODO Auto-generated constructor stub
      heap = new ArrayList<Integer>();
      mode = mod;
      hash = new HashMap<Integer, Node>();
      size_t = 0;
    }


    public int peek() {
     
      return heap.get(0);
    }


    public int size() {
     
      return size_t;
    }


    public Boolean isEmpty() {
     
      return (heap.size() == 0);
    }


    int parent(int id) {
     
      if (id == 0) {
     
        return -1;
      }
      return (id - 1) / 2;
    }


    int lson(int id) {
     
      return id * 2 + 1;
    }


    int rson(int id) {
     
      return id * 2 + 2;
    }


    boolean comparesmall(int a, int b) {
     
      if (a <= b) {
     
        if (mode == "min")
          return true;
        el
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值