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

相关推荐
zheyutao1 分钟前
字符串哈希
算法
痴儿哈哈9 分钟前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
A尘埃9 分钟前
保险公司车险理赔欺诈检测(随机森林)
算法·随机森林·机器学习
花酒锄作田23 分钟前
SQLAlchemy中使用UPSERT
python·sqlalchemy
SoleMotive.24 分钟前
一个准程序员的健身日志:用算法调试我的增肌计划
python·程序员·健身·职业转型
亓才孓32 分钟前
[Properties]写配置文件前,必须初始化Properties(引用变量没执行有效对象,调用方法会报空指针错误)
开发语言·python
Bruk.Liu37 分钟前
(LangChain 实战14):基于 ChatMessageHistory 自定义实现对话记忆功能
人工智能·python·langchain·agent
大江东去浪淘尽千古风流人物1 小时前
【VLN】VLN(Vision-and-Language Navigation视觉语言导航)算法本质,范式难点及解决方向(1)
人工智能·python·算法
Swift社区1 小时前
Gunicorn 与 Uvicorn 部署 Python 后端详解
开发语言·python·gunicorn
Coinsheep1 小时前
SSTI-flask靶场搭建及通关
python·flask·ssti