谷歌面经Perfect Rectangle【扫描线】

核心思想就是:能够正好围成一个矩形的情况就是:

有且只有:

- 最左下 最左上 最右下 最右上 的四个点只出现过一次,其他肯定是成对出现的(保证完全覆盖)

- 上面四个点围成的面积,正好等于所有子矩形的面积之和(保证不重复)

扫描线算法


false, 和 true就是常规扫描线算法里面的start, end object的属性。

对于false的 也就是left point of a rectangle, 我们采用他的left x.

对于true的,也就是right point of a rectangle 我们采用他的right x。

Top和Bot 意思就是当前见过的所有Rectangle 里的最高的地方,和最低的地方。

Time 他这里的意思是: 宽度, left 或者right。这是一个很容易错的地方!

很难理解的地方: RectLife里的compareTo.

意思是如果这个rectangle跟另一个Rectangle的width x值一样的话,我们要比较一下他们的left x 的大小。因为我们之前比较的width一样可能只是A的left跟B的right x一样。我们要把靠近左边的Rectangle优先处理

如果这个rectangle跟另一个Rectangle的width x值不一样的话。


我们有可能组成高度ok的东西,但是中间假设有一个gap就完蛋了。所以对于所有在一个x点的,我们判断能不能达到一样的高度。pq.peek().time == time...


PriorityQueue的排序顺序是按x点time来比的,如果x点一样,按照rect.l - that.rect.l也就是比x width。


TreeSet<> 用来装Rect的object,如果以前看过一个一毛一样的就不管了

跟扫描线一样,碰到start 加入set,【可以认为是一个stack】,碰到end remove (rl.rect).

recLife object有一个rect的object。可以通过他remove from stack.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,358评论 0 33
  • UIBezierPath Class Reference 译:UIBezierPath类封装了Core Graph...
    鋼鉄侠阅读 5,852评论 0 3
  • 二维码扫描最近两年简直是风靡移动互联网时代,尤其在国内发展神速。围绕条码扫码功能,首先说说通过本文你可以知道啥。一...
    55book阅读 9,687评论 0 1
  • 今天的晨读告诉我们怎么提升自己的思考力。 一张纸,横放;一支笔。 曾经有人说我的大脑空如白纸。事实上的确如此,跟别...
    houpanpan926阅读 3,073评论 1 7
  • 一些该被原谅的无法被原谅 而困惑者被不断搪塞 期翼者又在年迈中睡去 新生者在无知中冷漠 就这样 没有什么能激起村庄...
    年漠阅读 1,324评论 0 2

友情链接更多精彩内容