给定一些矩形2 求覆盖面积 矩形不超过200个

1#

算法1 朴素思想 虽然朴素但是代码却有意思

利用容斥原理

复杂度高达 N*2^N

class Solution:
def intersect(rec1,rec2):
return [max(rec1[1],rec2[1]),
max(rec1[2],rec2[2]),
min(rec1[3],rec2[3]),
min(rec1[4],rec2[4]
]
#这里是两个矩形的两点式求 矩形的相交子矩形 *非常值得思考 def area(rec):
dx=max(0,rec[2]-rec[0])
dy=max(0,rec[3]-rec[1])
return dx*dy ans=0 for size in range(1,len(rectangles)+1): for group in itertools.combinations(rectangles,size):
ans = ans +(-1)** (size+1) * area(reduce(intersect,group))
return ans%mod

2#

点位压缩,压缩后进行暴力循环

同时压缩x和y

最后返回

class Solution(object):
def rectangleArea(self, rectangles):
N = len(rectangles)
Xvals, Yvals = set(), set()
for x1, y1, x2, y2 in rectangles:
Xvals.add(x1); Xvals.add(x2)
Yvals.add(y1); Yvals.add(y2) imapx = sorted(Xvals)
imapy = sorted(Yvals)
mapx = {x: i for i, x in enumerate(imapx)}
mapy = {y: i for i, y in enumerate(imapy)} grid = [[0] * len(imapy) for _ in imapx]
for x1, y1, x2, y2 in rectangles:
for x in xrange(mapx[x1], mapx[x2]):
for y in xrange(mapy[y1], mapy[y2]):
grid[x][y] = 1 ans = 0
for x, row in enumerate(grid):
for y, val in enumerate(row):
if val:
ans += (imapx[x+1] - imapx[x]) * (imapy[y+1] - imapy[y])
return ans % (10**9 + 7)

N^3

3#

算法3 扫描线算法

将每一个矩形看作一个 "事件" 这样的事件

class Solution(object):
def rectangleArea(self, rectangles):
# Populate events
OPEN, CLOSE = 0, 1
events = []
for x1, y1, x2, y2 in rectangles:
events.append((y1, OPEN, x1, x2))
events.append((y2, CLOSE, x1, x2))
events.sort() def query():
ans = 0
cur = -1
for x1, x2 in active:
cur = max(cur, x1)
ans += max(0, x2 - cur)
cur = max(cur, x2)
return ans active = []
cur_y = events[0][0]
ans = 0
for y, typ, x1, x2 in events:
# For all vertical ground covered, update answer
ans += query() * (y - cur_y) # Update active intervals
if typ is OPEN:
active.append((x1, x2))
active.sort()
else:
active.remove((x1, x2)) cur_y = y return ans % (10**9 + 7)

4#

注意到刚才的3算法中使用了 区间维护的算法 这里使用线段树维护这个区间

使得达到 NlogN

下面是py 实现线段树

class Node:
def __init__(self,start,end):
self.start=start
self.end=end
self.mid=(start+end)//2 self.active_count=0
self.totle =0 self._left=None
self._right=None
@property
def right(self):
self._right= self._right or Node(self.mid,self.end)
return self._right @property
def left(self):
self._left=self._left or Node(self.start,self.mid)
return self._left #更新 i j 合适的区域 + val
#同时返回 i j 之间的x大小
def update(self,i,j,val):
print(str(i)+" "+str(j))
if(i>=j):
return 0 if(i==self.start and j==self.end):
self.active_count = self.active_count + val
else:
self.left .update( i, min( self.mid ,j ) , val )
self.right.update( max(self.mid,i) ,j, val ) #当前区域有 至少一个覆盖
if(self.active_count>0): self.totle= X[self.end]-X[self.start]
else: self.totle= self.left.totle + self.right.totle return self.totle class Solution:
def rectangleArea(self, rectangles):
"""
:type rectangles: List[List[int]]
:rtype: int
"""
ACTIVE = 1
DEACTIVE = -1
global X
X=set()
events=[]
for rect in rectangles:
X.add(rect[0])
X.add(rect[2]) events.append([rect[1],rect[0],rect[2],ACTIVE])
events.append([rect[3],rect[0],rect[2],DEACTIVE]) X=sorted(X)
events=sorted(events)
pos2idx={ x:i for i,x in enumerate(X) } sum_area=0
y_cur=0
y_cur_next=0
x_cur=0 SegNode = Node(0,len(pos2idx))
print(pos2idx)
for event in events:
y_cur_next=event[0]
sum_area=sum_area+(y_cur_next-y_cur)*x_cur x_cur=SegNode.update(pos2idx[event[1]],pos2idx[event[2]],event[3])
print(event)
print(x_cur) y_cur=y_cur_next return sum_area%(1000000000 + 7)

注意这里的 下标实际意义不是 容器 而是 标志

所以 会有

start mid

mid end

这样的划分方法 应该注意

另外利用python 的 property 很方便的写出了懒申请策略

(python 做点集压缩真的方便

付:

leetcode 56. Merge Intervals On 求overlap

leetcode 850. Rectangle Area II的更多相关文章

  1. [LeetCode] 850. Rectangle Area II 矩形面积之二

    We are given a list of (axis-aligned) rectangles.  Each rectangle[i] = [x1, y1, x2, y2] , where (x1, ...

  2. [LeetCode] 223. Rectangle Area 矩形面积

    Find the total area covered by two rectilinearrectangles in a 2D plane. Each rectangle is defined by ...

  3. leetcode之Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  4. [Swift]LeetCode850. 矩形面积 II | Rectangle Area II

    We are given a list of (axis-aligned) rectangles.  Each rectangle[i] = [x1, y1, x2, y2] , where (x1, ...

  5. Java for LeetCode 223 Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  6. (easy)LeetCode 223.Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  7. leetcode:Rectangle Area

    Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defined b ...

  8. Java [Leetcode 223]Rectangle Area

    题目描述: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is def ...

  9. LeetCode(41)-Rectangle Area

    题目: Find the total area covered by two rectilinear rectangles in a 2D plane. Each rectangle is defin ...

随机推荐

  1. 左神算法进阶班1_1添加最少字符得到原字符N次

    Problem: 给定一个字符串str1,只能往str1的后面添加字符变成str2. 要求1:str2必须包含两个str1,两个str1可以有重合,但是不能以同一个位置开头. 要求2:str2尽量短最 ...

  2. Java中String str=new String("a")和String str = "a"有什么区别?

    Q: String A="ABC"; String B=new String("ABC"); 这两个值,A,B 是否相等,如果都往HashSet里面放,能放下吗 ...

  3. eclipse 克隆 https 地址的 Git 仓库报错:cannot open git-upload-pack

    解决方法:Window >Preferences >Team>Git>User settings点击Add Entry设置key:http.sslVerify value:fa ...

  4. [转]gnome环境中将家目录下预设的文件夹由中文名称改为英文名称

    参考文章:gnome环境中将家目录下预设的文件夹由中文名称改为英文名称 打开终端 1 修改语言环境为英文 export LANG=en_US 如果想修改语言环境为日语,可执行 export LANG= ...

  5. Java 怎样实现调用其他方法

    Java主类的main方法调用其他方法 方法1: funA()方法设为静态方法. 当主类加载到内存,funA()分配了入口地址,主要代码如下: public class test{ static vo ...

  6. leetcode146周赛-5130-等价多米诺骨牌对的数量

    题目描述: 方法一: class Solution(object): def numEquivDominoPairs(self, dominoes): """ :type ...

  7. webpack 清理旧打包资源插件

    当我们修改带hash的文件并进行打包时,每打包一次就会生成一个新的文件,而旧的文件并 没有删除.为了解决这种情况,我们可以使用clean-webpack-plugin 在打包之前将文件先清除,之后再打 ...

  8. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  9. vue-cli 本地环境 API 代理设置和解决跨域

    前言 我们在使用 vue-cli 启动项目的时候npm run dev便可以启动我们的项目了,通常我们的请求地址是以 localhost: 来请求接口数据的,localhost 是没有办法设置 coo ...

  10. C++ 连接上期所CTP交易行情接口

    CTP相关接口和文档下载: http://www.simnow.com.cn/static/softwareDownload.action 相关库文件以及头文件如下: 遇到的问题: 1.运行直接退出了 ...