核心思想就是:能够正好围成一个矩形的情况就是:
有且只有:
- 最左下 最左上 最右下 最右上 的四个点只出现过一次,其他肯定是成对出现的(保证完全覆盖)
- 上面四个点围成的面积,正好等于所有子矩形的面积之和(保证不重复)
扫描线算法
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.