楼主: Yunying
跳转到指定楼层
上一主题 下一主题
收起左侧

Square第二轮电面 2015/10/1

🔗
开水蛙 2015-10-8 17:43:11 | 只看该作者
全局:
你们面square的后来都怎么样了啊
回复

使用道具 举报

🔗
ammmmy11 2015-10-10 08:27:27 | 只看该作者
全局:
square onsite面经好少啊,强烈建议楼主onsite回来share下下,提前预祝楼主拿offer哈哈
回复

使用道具 举报

🔗
 楼主| Yunying 2015-10-10 09:23:34 | 只看该作者
全局:
cjqhenry 发表于 2015-10-7 08:05
楼主能说下具体咋做的么? 感觉略难啊,多谢!

就是类似于Skyline的思路。弄一个map,然后把所有高度变化的节点都存在Map里,然后每掉下来一个方块就update map就好了
回复

使用道具 举报

🔗
 楼主| Yunying 2015-10-10 09:23:42 | 只看该作者
全局:
开水蛙 发表于 2015-10-8 17:43
你们面square的后来都怎么样了啊

还没onsite啊
回复

使用道具 举报

🔗
zxl9171 2015-10-27 16:20:13 | 只看该作者
全局:
这题用segment tree吧
回复

使用道具 举报

🔗
ammmmy11 2015-10-29 15:15:21 | 只看该作者
全局:
zxl9171 发表于 2015-10-27 16:20
这题用segment tree吧

我也觉得用segment tree, 但是建树要有个上限,这道题不知道有没有给上限
回复

使用道具 举报

🔗
zxl9171 2015-11-3 12:15:56 | 只看该作者
全局:
所以这道题到底应该怎么做啊
回复

使用道具 举报

🔗
kelong 2016-2-22 11:32:43 | 只看该作者
全局:
这个题是比较典型的线段树(segment tree)。一种解法是:
1. define Node { double x1, x2, h },即代表X轴上坐标x1到x2之间能够遇到的最大高度为h
2. 每次来一个方块,设x坐标范围为(a, b),高度ht, 那么查找segment tree,得到(a, b)之间最大高度,设为H,则(a,b)区间的新高度需要变成(H+ht)
3. 更新segment tree,使(a, b)区间新高度为(H+ht):从根节点开始遍历,
    1)如果cur_node的(x1,x2)完全包括了(a,b)
          1) cur_node.h = (H+ht)
          2) 如果cur_node有子节点, 递归更新子节点
    2) 如果(x1, x2)跟(a,b)部分重合,假设 a < x1 < b < x2:
           1)生成一个新节点,范围:(a,x2)
           2)新节点left_child生成新节点, 范围(a,x1),right_child = cur_node (范围为x1-x2)
           3) 递归更新cur_node, 但范围从开始的(a,b)变成了(x1,b)

如此即可。
回复

使用道具 举报

全局:
Standard segment tree solution:

  1. #include <iostream>
  2. #include <vector>
  3. #include <assert.h>

  4. using namespace std;

  5. struct Node {
  6.     Node* left, *right;
  7.     int start, end, maxHei;
  8.     Node(int s, int e): start(s), end(e), maxHei(0), left(NULL), right(NULL) {}
  9. };

  10. class SegTree {
  11. public:
  12.     SegTree(int mr): minRange(1), maxRange(mr) {
  13.         root = build(minRange, maxRange); // Initialize a range with height 0.
  14.     }
  15.    
  16.     void drop(int position, int size) {
  17.         int start = position, end = position + size - 1;
  18.         int newHei = query(root, start, end) + size;
  19.         modify(root, start, end, newHei);
  20.     }
  21.    
  22.     int getHeight() {
  23.         return root->maxHei;
  24.     }
  25.    
  26. private:
  27.     Node* root;
  28.     int minRange, maxRange;
  29.    
  30.     Node* build(int start, int end) {
  31.         if(start > end) return NULL;
  32.         if(start == end) {
  33.             Node* newnode = new Node(start, start);
  34.             return newnode;
  35.         }
  36.         Node* node = new Node(start, end);
  37.         int mid = start + (end - start) / 2;
  38.         node->left = build(start, mid);
  39.         node->right = build(mid+1, end);
  40.         return node;
  41.     }
  42.    
  43.     int query(Node* node, int start, int end) {
  44.         if(!node) return INT_MIN;
  45.         if(node->start >= start && node->end <= end) return node->maxHei;
  46.         if(node->start > end || node->end < start) return INT_MIN;
  47.         return max(query(node->left, start, end), query(node->right, start, end));
  48.     }
  49.    
  50.     void modify(Node* node, int start, int end, int newHei) {
  51.         if(node->start > end || node->end < start) return;
  52.         if(node->start == node->end) {
  53.             node->maxHei = newHei;
  54.             return;
  55.         }
  56.         modify(node->left, start, end, newHei);
  57.         modify(node->right, start, end, newHei);
  58.         node->maxHei = max(node->left->maxHei, node->right->maxHei);
  59.     }
  60.    
  61. };

  62. int main(int argc, const char * argv[]) {
  63.     int maxRange = 10;
  64.     SegTree seg(maxRange);
  65.     seg.drop(1, 2);
  66.     seg.drop(5, 3);
  67.     assert(seg.getHeight() == 3);
  68.     seg.drop(2, 4);
  69.     assert(seg.getHeight() == 7);
  70.     seg.drop(8, 3);
  71.     assert(seg.getHeight() == 7);
  72.     seg.drop(1, 4);
  73.     assert(seg.getHeight() == 11);
  74.     seg.drop(7, 2);
  75.     return 0;
  76. }
复制代码
回复

使用道具 举报

🔗
jennyHappy 2017-5-15 08:25:00 | 只看该作者
全局:
这题首先区间范围并没有给定。可能是 0 - DOUBLE_MAX。再者 position都是double的数字。所以segment tree似乎无法真正解决。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表