谷歌面经Perfect Rectangle【扫描线】

谷歌面经Perfect Rectangle【扫描线】_第1张图片

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

有且只有:

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

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

扫描线算法


谷歌面经Perfect Rectangle【扫描线】_第2张图片

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,如果以前看过一个一毛一样的就不管了

谷歌面经Perfect Rectangle【扫描线】_第3张图片

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

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

你可能感兴趣的:(谷歌面经Perfect Rectangle【扫描线】)