LeetCode 每日一题 2025/12/1-2025/12/7

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


目录

      • [12/1 2141. 同时运行 N 台电脑的最长时间](#12/1 2141. 同时运行 N 台电脑的最长时间)
      • [12/2 3623. 统计梯形的数目 I](#12/2 3623. 统计梯形的数目 I)
      • [12/3 3625. 统计梯形的数目 II](#12/3 3625. 统计梯形的数目 II)
      • [12/4 2211. 统计道路上的碰撞次数](#12/4 2211. 统计道路上的碰撞次数)
      • [12/5 3432. 统计元素和差值为偶数的分区方案](#12/5 3432. 统计元素和差值为偶数的分区方案)
      • [12/6 3578. 统计极差最大为 K 的分割方式数](#12/6 3578. 统计极差最大为 K 的分割方式数)
      • 12/7

12/1 2141. 同时运行 N 台电脑的最长时间

二分 判断mid时长是否满足

容量大于mid的电池x 最多可以使用mid次

容量小于mid的电池x 最多使用batteries[x]次

统计总次数是否大于mid*n

python 复制代码
def maxRunTime(n, batteries):
    """
    :type n: int
    :type batteries: List[int]
    :rtype: int
    """
    l,r,ans=0,sum(batteries)//n,0
    while l<=r:
        mid=(l+r)//2
        total =0
        for cap in batteries:
            total += min(cap,mid)
        if total >=n*mid:
            ans=mid
            l=mid+1
        else:
            r=mid-1
    return ans

12/2 3623. 统计梯形的数目 I

统计每一行 有多少个点

构成一个梯形 任意两行 每行取两个点的可能性相乘

python 复制代码
def countTrapezoids(points):
    """
    :type points: List[List[int]]
    :rtype: int
    """
    from collections import defaultdict
    MOD=10**9+7
    m=defaultdict(int)
    for p in points:
        m[p[1]]+=1
    totaledge,edge=0,0
    ans=0
    for pnum in m.values():
        edge = pnum*(pnum-1)//2
        ans = (ans+edge*totaledge)%MOD
        totaledge = (totaledge+edge)%MOD
    return ans
    

12/3 3625. 统计梯形的数目 II

两条平行线 斜率相同

平行四边形被计算了两次 去除对角线中点重合的两对平行线

python 复制代码
def countTrapezoids(points):
    """
    :type points: List[List[int]]
    :rtype: int
    """
    from collections import defaultdict
    n=len(points)
    slope = defaultdict(list)
    mid = defaultdict(list)
    ans = 0
    
    for i in range(n):
        x1,y1=points[i]
        for j in range(i+1,n):
            x2,y2=points[j]
            dx=x1-x2
            dy=y1-y2
            
            k = float("inf")
            if x1==x2:
                b=x1
            else:
                k=(y2-y1)/(x2-x1)
                b=(y1*dx-x1*dy)/dx
            midv=(x1+x2)*10000+(y1+y2)
            slope[k].append(b)
            mid[midv].append(k)

    for slist in slope.values():
        if len(slist)==1:
            continue
        cnt = defaultdict(int)
        for bv in slist:
            cnt[bv]+=1
        totalsum=0
        for count in cnt.values():
            ans+=totalsum*count
            totalsum+=count
        print(ans,totalsum)
    
    for mlist in mid.values():
        if len(mlist)==1:
            continue
        cnt=defaultdict(int)
        for kv in mlist:
            cnt[kv]+=1
        totalsum=0
        for count in cnt.values():
            ans-=totalsum*count
            totalsum+=count
    return ans

12/4 2211. 统计道路上的碰撞次数

从左到右遍历所有车辆

tag标记左侧状态 -1为没有车或者都是左向的车

0为有停住的车

其他为向右开的车数量

python 复制代码
def countCollisions(directions):
    """
    :type directions: str
    :rtype: int
    """
    ans=0
    tag=-1
    
    for d in directions:
        if d=='L':
            if tag>=0:
                ans += tag+1
                tag=0
        elif d=='S':
            if tag>0:
                ans+=tag
            tag=0
        else:
            if tag>=0:
                tag+=1
            else:
                tag=1
    return ans

12/5 3432. 统计元素和差值为偶数的分区方案

差为偶数 说明左右两边和的奇偶性相同

奇偶性相同说明总和一定是偶数

只要总和为偶数 无论什么位置都满足

python 复制代码
def countPartitions(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    n=len(nums)
    return n-1 if sum(nums)%2==0 else 0

12/6 3578. 统计极差最大为 K 的分割方式数

动规

dp[i]标识以下标i结尾的前缀子数组有多少方案

pre[i]为前i个下标结尾的合法方案综合

cnt记录当前数组 将当前数值放入查看是否满足

python 复制代码
def countPartitions(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    from sortedcontainers import SortedList
    MOD=10**9+7
    n=len(nums)
    dp=[0]*(n+1)
    pre=[0]*(n+1)
    cnt=SortedList()
    
    dp[0]=1
    pre[0]=1
    
    j=0
    for i in range(n):
        cnt.add(nums[i])
        while j<=i and cnt[-1]-cnt[0]>k:
            cnt.remove(nums[j])
            j+=1
        dp[i+1]=(pre[i]-(pre[j-1] if j>0 else 0))%MOD
        pre[i+1]=(pre[i]+dp[i+1])%MOD
    return dp[n]

12/7

python 复制代码

相关推荐
eWidget4 分钟前
随机森林原理:集成学习思想 —— Java 实现多棵决策树投票机制
java·数据库·随机森林·集成学习·金仓数据库
Traced back12 分钟前
SQL Server 核心语法+进阶知识点大全(小白版)
数据库·sqlserver
资深web全栈开发17 分钟前
PostgreSQL枚举还是字符串:ENUM vs VARCHAR + CHECK 的权衡
数据库·postgresql
elseif12322 分钟前
【C++】并查集&家谱树
开发语言·数据结构·c++·算法·图论
凯子坚持 c30 分钟前
C++基于微服务脚手架的视频点播系统---客户端(4)
数据库·c++·微服务
偷吃的耗子33 分钟前
【CNN算法理解】:卷积神经网络 (CNN) 数值计算与传播机制
人工智能·算法·cnn
OceanBase数据库官方博客36 分钟前
OceanBase场景解码系列三|OB Cloud 如何稳定支撑中企出海实现数 10 倍的高速增长?
数据库·oceanbase·分布式数据库
徐小夕@趣谈前端43 分钟前
Web文档的“Office时刻“:jitword共建版2.0发布!让浏览器变成本地生产力
前端·数据结构·vue.js·算法·开源·编辑器·es6
m0_561359671 小时前
使用Python处理计算机图形学(PIL/Pillow)
jvm·数据库·python
问好眼1 小时前
【信息学奥赛一本通】1275:【例9.19】乘积最大
c++·算法·动态规划·信息学奥赛