Advertisement
absolute100

Untitled

Nov 25th, 2016
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.76 KB | None | 0 0
  1. ### The Skyline Problem
  2. 要点:这题是难题,但是是重点难题,因为google常考,而且很多变形。题本身的pattern就是从左到右更新区间内存在值的最大值(对于这题就是skyline)。最简单的解法就是从左到右根据每个区间的enter/exit point更新存在值的集合。 同时因为区间值集合是不断变化的,需要有个data structure来track当前最大值,priority queue和tree map都可以。
  3. 实现上还有不少细节
  4.  
  5. - priority queue中元素类型?一个integer就够了
  6. - compare function:等于?
  7. - 注意这个compare function是对时间点sort时候用的,而不是priority queue的,priority queue只根据height来排序
  8. - 输入输出
  9.  
  10. EDIT: 补充更好的方法(更简单,并且beat 98.2% python)
  11.  
  12. - 因为building已经按start排好了,不用再排序。heap的最大height就是当前iteration的skyline。当然可能当前的height和当前skyline相同,不更新,这个code的结构就非常简单。
  13. - 如何定义当前iteration?每个新的start和当前在heap的最大height的end做比较,两个分支:
  14. - 新的start的存在并且<=heap顶的end,这时候push(push要在loop里把所有==start的都push进去,==heap顶end也要push)
  15. - 1的reverse:没新start了,或者新start有空隙。这时候当前iteration就是考虑当前skyline的end(也就会上轮heap的最大值)。pop也是在loop里,把所有已经结束的段pop出来。
  16. - x: either next start or current end, so it’s in skyline
  17. - 综上,总循环就是i<n or heap有值
  18. - 边界条件:
  19. - 如果start和heap顶end相同,那么push,因为这样height是连续下去的
  20. - push的时候,多个start相同,要全部push,因为以最大的height为准
  21. - pop的时候要pop所有dead end:所以第二维也要按最大排序,这样height相同的时候保证end大的作为标准
  22. - lintcode的输出方式:
  23. - 不是只需要跳变,而是需要输出非0区间
  24. - 区间:记录last height,而height变化的时候就输出,只要不是变成0,上一个end和下一个start是同一点,一起更新
  25. - 非0:如果是0,那么start是不更新的,reset为-1。同理,如果start是-1,下一次跳变更新start
  26.  
  27. ### Meeting Rooms I/II
  28. 要点:这题和skyline类似,利用了interval start有序的特点,从左向右处理,用一个heap来动态表示当前占用rooms的时间段,所以heap的size就是room数。具体来说,
  29.  
  30. - heap是end time的min heap
  31. - 当前?就是和新interval同时使用room的情况
  32. - 如果min end<=新的interval.start,那么同一房间可以被这个interval重用。同时所有heap中end小的都要pop
  33. - 如果min end>新的interval.start<min end:因为新interval.start比所有当前在heap中start的都晚,所以一定与所有heap中interval在某一点都有交集。所有max需要新房间,要push heap
  34. - 所以在heap中的intervals必然都是在某一点互相重叠的
  35. - 当然用endPoint sort + count的方法也可以。都是O(nlgn),但不需要heap
  36.  
  37. https://repl.it/CfU6/4 (II)
  38. 错误点:不管是否pop,都要push新的:either 占新room or replace旧room
  39. https://repl.it/CoP7 (I)
  40.  
  41. EDIT:
  42. 还有一类类似的题,是room (or 资源)有限,如何选最多的meeting。
  43.  
  44. 4/15/16 Fri
  45. ### Wildcard Matching
  46. 要点:
  47.  
  48. - 基本code pattern是以待匹配string s为中心loop,一旦没有任何p的分支match,返回false。如果所有s匹配了,还要检查是不是p也exhausted,一种分支是剩下的p是’*’,这样也可以匹配。
  49. - worst case: s: abcd, p: *e*f*g*h? every *, it swallows all abcd. so it O(n^2)
  50.  
  51. 错误点:
  52.  
  53. - star和ss:star对应的是’*’这点在pattern中的位置,ss对应的是在上次没有swallow的s点的位置。实际上是记录了可以restore的状态
  54.  
  55. 4/6/16
  56. ### Regular Expression Matching及变形
  57. 要点
  58. fb的常考题, uber也考过。
  59.  
  60. 思路: recursion是基本的结构: 假设s为待匹配string, p为pattern. 当前要匹配si和pi位置的char. 因为有*的存在, 自然分成两种case: 就是有*和没有*. 如果不是*, 只比较当前2个字符. 如果遇到*, 需要loop si当前位置所有向右(recursion)或者向左(dp)的相同char. 每一个会产生一个新的递归分支. 注意skip当前字符也是一个分支.
  61.  
  62. recursion:
  63. base condition: 因为递归是向右, 所以如果pi超过pattern, 递归结束.
  64. 因为*是和左边的字符关联的, 递归向右的情况, 其条件是p[pi+1]=='*'.
  65. worst case: s: aa…aab, p: a*…a*: 每一层都要loop所有s中的a,loop中的每一个进入一个同样loop的层,形成一个tree structure,所以是O(2^n),space是O(n)
  66.  
  67. dp:
  68. base condition: p向右移动
  69. 以当前字符是否为*作为条件
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement