📣 独立日限时特惠: VIP通行证立减$68
123
返回列表 发新帖
楼主: Yunying
跳转到指定楼层
上一主题 下一主题
收起左侧

Square第二轮电面 2015/10/1

全局:
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似乎无法真正解决。
回复

使用道具 举报

无效楼层,该帖已经被删除
无效楼层,该帖已经被删除
🔗
fang5034012 2017-10-2 02:07:20 | 只看该作者
全局:
还没仔细学习线段树,自己先想了个方法来实现。基本思想就保存每次掉下来一个箱子之后他的start, end, 和height。然后根据height的高低来进行保存。从高往低,遍历每一个箱子。如果新掉下来的箱子start和end掉在某个箱子的位置范围内,就根据那个箱子的高度加上新的箱子的size得到新箱子的高度,然后保存。最后由于我们需要根据height来保存,所以要做一个排序。
时间复杂度有点高。drop是O(nlogn), getHeight是O(1)。自己写了一些test case跑了一下没发现问题。请大神帮忙看一下。如果有问题,请留言。谢谢
  1. class Solution:
  2.         def __init__(self):
  3.                 self.boxes = []

  4.         def drop(self, pos, size):
  5.                 start = pos
  6.                 end = pos + size
  7.                 if not self.boxes:
  8.                         self.boxes.append([start, end, size])
  9.                 else:
  10.                         for i in xrange(len(self.boxes)-1, -1, - 1):
  11.                                 s = self.boxes[i][0]
  12.                                 e = self.boxes[i][1]
  13.                                 h = self.boxes[i][2]
  14.                                 if s < start < e or s < end < e:
  15.                                         self.boxes.append([start, end, h + size])
  16.                                         break
  17.                                 if i == 0:
  18.                                         self.boxes.append([start, end, size])
  19.                 self.boxes.sort(key=lambda x: [x[2], x[0], x[1]])

  20.         def getHeight(self):
  21.                 if not self.boxes:
  22.                         return 0
  23.                 return self.boxes[-1][2]

  24. s = Solution()
  25. s.drop(1, 4)
  26. s.drop(2, 3)
  27. s.drop(1,1)
  28. s.drop(6,10)
  29. s.drop(10, 1)
  30. print(s.getHeight())
复制代码


回复

使用道具 举报

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

本版积分规则

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