持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
- 1 <= rects.length <= 100
- rects[i].length == 4
- 109 <= ai < xi <= 109
- 109 <= bi < yi <= 109
- xi - ai <= 2000
- yi - bi <= 2000
- 所有的矩形不重叠。
- pick 最多被调用 104 次
二、思路分析:
我们读取本题,题目要求我们在矩形中随机生成一个左边点。从题目中了解到几点信息:
- 矩形个数范围在1~100个
- 矩形之间不存在重叠矩形
我们根据题目,可以采取前缀+二分法来实现,思路如下:
- 首先根据rects,求出所有的矩形面积S,并用列表存储每一个矩形的面积
- 因为矩形都给出两个坐标:左小角(a,b),右上角(x,y)
- 因此矩形的面积(x-a+1)*(y-b+1)
- 先在面积和中随机生成一个K,找到具体的矩形编号
- 确定矩形编号时,可以采用预处理前缀和和二分搜索的方式
如上思路,我们使用python实现代码如下:
class Solution(object):
def __init__(self, rects):
"""
:type rects: List[List[int]]
"""
self.rects = rects
self.s = [0]*(len(rects)+1)
for idx,rect in enumerate(self.rects):
a,b,x,y = rect[0],rect[1],rect[2],rect[3]
self.s[idx+1] = self.s[idx] + (x-a+1)*(y-b+1)
def pick(self):
"""
:rtype: List[int]
"""
k = randrange(self.s[-1])
reindex = bisect_right(self.s,k)-1
a, b, _, y = self.rects[reindex]
da, db = divmod(k - self.s[reindex], y - b + 1)
return [a + da, b + db]
三、总结:
本期考察我们使用前缀法来记录矩形的范围,最后仍然通过矩形面积来逆向推导出随机点坐标,AC记录如下:
- 时间复杂度:构造函数复杂度为 O(n),pick函数复杂度O(logn)
- 空间复杂度:构造函数复杂度为 O(n),pick 函数复杂度为 O(1)
以上是本期内容,欢迎大佬们点赞评论,下期见~~