LeetCode 每日一题 2026/1/12-2026/1/18

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步


目录

      • [1/12 1266. 访问所有点的最小时间](#1/12 1266. 访问所有点的最小时间)
      • [1/13 3453. 分割正方形 I](#1/13 3453. 分割正方形 I)
      • [1/14 3454. 分割正方形 II](#1/14 3454. 分割正方形 II)
      • [1/15 2943. 最大化网格图中正方形空洞的面积](#1/15 2943. 最大化网格图中正方形空洞的面积)
      • [1/16 2975. 移除栅栏得到的正方形田地的最大面积](#1/16 2975. 移除栅栏得到的正方形田地的最大面积)
      • 1/17
      • 1/18

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

官解https://leetcode.cn/problems/separate-squares-ii/solutions/3878861/fen-ge-zheng-fang-xing-ii-by-leetcode-so-baas/?envType=daily-question\&envId=2026-01-14

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 复制代码

相关推荐
思成Codes2 小时前
ACM训练:接雨水3.0——动态接雨水
数据结构·算法
sin_hielo2 小时前
leetcode 2943
数据结构·算法·leetcode
Fasda123452 小时前
基于yolo11-C3k2-AKConv的太阳能电池片缺陷检测技术分享
python
观测云2 小时前
AWS Lambda Python 应用可观测最佳实践(DDTrace)
python·云计算·aws
Snow_day.2 小时前
有关平衡树
数据结构·算法·贪心算法·动态规划·图论
翔云1234563 小时前
(MySQLdb._exceptions.OperationalError) (2006, ‘MySQL server has gone away‘)
网络·python
Hcoco_me3 小时前
大模型面试题75:讲解一下GRPO的数据回放
人工智能·深度学习·算法·机器学习·vllm
Xの哲學3 小时前
Linux设备驱动模型深度解剖: 从设计哲学到实战演练
linux·服务器·网络·算法·边缘计算
我是一只小青蛙8883 小时前
Python办公自动化:6大实用库速览
python