此题关键是构造出来一个”均匀选取“的方式。
我们先考虑如何在一个矩阵里面均匀选点,比如(1,1),(4,5)构造的,很容易看出一共有20个点,如果我们把它看成一条一条的,就很容易去获取了。
现在我们需要获取这里面的第10个点,我们从下往上构造,从0开始计数,dx=1,dy=2。
这是因为w=(x2-x1+1)的话,9%4=1,9//4=2。
这样就很明朗了。
接下来我们如何得知从哪个矩形选择, 需要根据矩形的面积来给定一个权重 。具体见代码即可,但是随即得到的数字其实已经相当于第K个点了。
import random
class Solution:
def __init__(self, rects: List[List[int]]):
self.rects=rects
self.sq=[]
s=0
for r in rects:
x1,y1,x2,y2=r
s+=(x2-x1+1)*(y2-y1+1)
self.sq.append(s)
def pick(self) -> List[int]:
t=random.randint(1,self.sq[-1])
i=0
while i<len(self.sq):
if i==0 and t<=self.sq[i] or self.sq[i-1]<t<=self.sq[i]:
break
i+=1
r=self.rects[i]
x1,y1,x2,y2=r
w,h=x2-x1+1,y2-y1+1
t-=self.sq[i]-w*h+1
return [x1+t%w,y1+t//w]