记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
1/12 1266. 访问所有点的最小时间
两个点接近时优先走斜线 假设两个点x0,y0 x1,y1
dx=|x0-x1| dy=|y0-y1|
dx<dy 先对角线走dx次 然后垂直移动dy-dx 总计dy次
dx=dy 对角线走dx次
dx>dy 先对角线走dy次 然后水平移动dx-dy 总计dx次
所以移动次数为max(dx,dy)
python
def minTimeToVisitAllPoints(points):
"""
:type points: List[List[int]]
:rtype: int
"""
x0,y0=points[0]
ans=0
for i in range(1,len(points)):
x1,y1=points[i]
ans += max(abs(x0-x1),abs(y0-y1))
x0,y0=points[i]
return ans
1/13 3453. 分割正方形 I
二分 统计每条横线分割得到的面积
python
def separateSquares(squares):
"""
:type squares: List[List[int]]
:rtype: float
"""
maxy,total=0.0,0.0
for x,y,l in squares:
total += l*l
maxy = max(maxy,y+l)
def check(limity):
area=0
for x,y,l in squares:
if y<limity:
area += l*min(l,limity-y)
return area>=total/2
l,r=0.0,maxy
eps=1e-5
while abs(r-l)>eps:
mid=(l+r)/2
if check(mid):
r=mid
else:
l=mid
return r
1/14 3454. 分割正方形 II
python
def separateSquares(squares):
"""
:type squares: List[List[int]]
:rtype: float
"""
from typing import List
import bisect
class SegmentTree:
def __init__(self, xs):
self.xs = xs
self.n = len(xs) - 1
self.count = [0] * (4 * self.n)
self.covered = [0] * (4 * self.n)
def update(self, qleft, qright, qval, left, right, pos):
if self.xs[right+1] <= qleft or self.xs[left] >= qright:
return
if qleft <= self.xs[left] and self.xs[right+1] <= qright:
self.count[pos] += qval
else:
mid = (left + right) // 2
self.update(qleft, qright, qval, left, mid, pos*2 + 1)
self.update(qleft, qright, qval, mid+1, right, pos*2 + 2)
if self.count[pos] > 0:
self.covered[pos] = self.xs[right + 1] - self.xs[left]
else:
if left == right:
self.covered[pos] = 0
else:
self.covered[pos] = self.covered[pos * 2 + 1] + self.covered[pos * 2 + 2]
def query(self):
return self.covered[0]
events = []
xs_set = set()
for x, y, l in squares:
events.append((y, 1, x, x + l))
events.append((y + l, -1, x, x + l))
xs_set.update([x, x + l])
xs = sorted(xs_set)
seg_tree = SegmentTree(xs)
events.sort()
psum = []
widths = []
total_area = 0.0
prev_y = events[0][0]
for y, delta, xl, xr in events:
length = seg_tree.query()
total_area += length * (y - prev_y)
seg_tree.update(xl, xr, delta, 0, seg_tree.n - 1, 0)
psum.append(total_area)
widths.append(seg_tree.query())
prev_y = y
target = (total_area + 1) // 2
i = bisect.bisect_left(psum, target) - 1
area = psum[i]
width = widths[i]
height = events[i][0]
return height + (total_area - area * 2) / (width * 2.0)
1/15 2943. 最大化网格图中正方形空洞的面积
除了bar中的线条 别的无法删除
找bar中连续的线条 一起删除可以得到一个矩形
找到每个bar最长的连续递增子数组即可 因为要正方形 找两边的较小值
python
def maximizeSquareHoleArea(n, m, hBars, vBars):
"""
:type n: int
:type m: int
:type hBars: List[int]
:type vBars: List[int]
:rtype: int
"""
def check(bar):
bar.sort()
mx,cnt=0,0
for i,v in enumerate(bar):
if i>0 and v==bar[i-1]+1:
cnt+=1
else:
cnt=1
mx=max(mx,cnt)
return mx
side=min(check(hBars),check(vBars))+1
return side*side
1/16 2975. 移除栅栏得到的正方形田地的最大面积
分别求出水平垂直方向上去除栅栏能够得到的边长长度
两个集合求交集取最大值
python
def maximizeSquareArea(m, n, hFences, vFences):
"""
:type m: int
:type n: int
:type hFences: List[int]
:type vFences: List[int]
:rtype: int
"""
def check(fences,border):
l=sorted([1]+fences+[border])
s=set()
for i in range(len(l)):
for j in range(i+1,len(l)):
s.add(l[j]-l[i])
return s
MOD=10**9+7
h=check(hFences, m)
v=check(vFences,n)
maxb=max(h&v,default=0)
return (maxb**2)%MOD if maxb else -1
1/17
python
1/18
python