LeetCode 每日一题 2026/1/19-2026/1/25

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


目录

      • [1/191292. 元素和小于等于阈值的正方形的最大边长](#1/191292. 元素和小于等于阈值的正方形的最大边长)
      • [1/20 3314. 构造最小位运算数组 I](#1/20 3314. 构造最小位运算数组 I)
      • [1/21 3315. 构造最小位运算数组 II](#1/21 3315. 构造最小位运算数组 II)
      • [1/22 3507. 移除最小数对使数组有序 I](#1/22 3507. 移除最小数对使数组有序 I)
      • [1/23 3510. 移除最小数对使数组有序 II](#1/23 3510. 移除最小数对使数组有序 II)
      • 1/24
      • 1/25

1/191292. 元素和小于等于阈值的正方形的最大边长

枚举正方形左上角 以及边长

s[i][j]记录左上角为(0,0)右下角为(i,j)的矩形内数字和

python 复制代码
def maxSideLength(mat, threshold):
    """
    :type mat: List[List[int]]
    :type threshold: int
    :rtype: int
    """
    m,n=len(mat),len(mat[0])
    s=[[0]*(n+1) for _ in range(m+1)]
    for i,row in enumerate(mat):
        for j,x in enumerate(row):
            s[i+1][j+1]=s[i+1][j]+s[i][j+1]-s[i][j]+x
    
    def check(r1,c1,r2,c2):
        return s[r2+1][c2+1]-s[r2+1][c1]-s[r1][c2+1]+s[r1][c1]
    
    ans=0
    for i in range(m):
        for j in range(n):
            while i+ans<m and j+ans<n and check(i,j,i+ans,j+ans)<=threshold:
                ans+=1
    return ans

1/20 3314. 构造最小位运算数组 I

奇数可以构造

对于一个1xxxx01111的数 想让答案最小

将从低位到高位连续个1的最高位1变为0即可

对于xxx00111 加上1可以进一位 xxx01000 两数相或 可以得到 01111

python 复制代码
def minBitwiseArray(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    n=len(nums)
    for i in range(n):
        ans=-1
        d=1
        while (nums[i]&d)!=0:
            ans=nums[i]-d
            d<<=1
        nums[i]=ans
    return nums

1/21 3315. 构造最小位运算数组 II

奇数可以构造

对于一个1xxxx01111的数 想让答案最小

将从低位到高位连续个1的最高位1变为0即可

对于xxx00111 加上1可以进一位 xxx01000 两数相或 可以得到 01111

python 复制代码
def minBitwiseArray(nums):
    """
    :type nums: List[int]
    :rtype: List[int]
    """
    n=len(nums)
    for i in range(n):
        ans=-1
        d=1
        while (nums[i]&d)!=0:
            ans=nums[i]-d
            d<<=1
        nums[i]=ans
    return nums

1/22 3507. 移除最小数对使数组有序 I

模拟 遍历数组记录两两相加的最小值mins 和位置ind

check记录是否是非递减数组

python 复制代码
def minimumPairRemoval(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    cnt=0
    
    while len(nums)>1:
        check=True
        mins=float("inf")
        ind=-1
        
        for i in range(len(nums)-1):
            s = nums[i]+nums[i+1]
            
            if nums[i]>nums[i+1]:
                check=False
            if s<mins:
                mins=s
                ind=i
        if check:
            break
        cnt+=1
        nums[ind]=mins
        nums.pop(ind+1)
    return cnt

1/23 3510. 移除最小数对使数组有序 II

将两两相加的和放入有序队列sl中 (nums[i]+nums[i+1],i)

dec记录当前队列非递减的个数

ind为剩余坐标

合并i,nxt 相当于nums[i]+=nums[nxt] 并删除nxt

dec的变化为pre,i,nxt,nxt2四个位置情况决定

如果nums[i]>nums[nxt] 那么dec-1

删除前如果nums[pre]>nums[i] dec-1

删除后如果nums[pre]>nums[i]+nums[nxt] dec+1

删除前如果nums[nxt]>nums[nxt2] dec-1

删除后如果nums[i]+nums[nxt]>nums[nxt2] dec+1

python 复制代码
def minimumPairRemoval(nums):
    """
    :type nums: List[int]
    :rtype: int
    """
    from sortedcontainers import SortedList
    n=len(nums)
    dec=0
    sl=SortedList()
    ind=SortedList(range(n))
    
    for i in range(n-1):
        if nums[i]>nums[i+1]:
            dec+=1
        sl.add((nums[i]+nums[i+1],i))
    
    ans = 0
    while dec>0:
        ans+=1
        
        s,i=sl.pop(0)
        k=ind.bisect_left(i)
        
        nxt=ind[k+1]
        if nums[i]>nums[nxt]:
            dec-=1
        if k>0:
            pre=ind[k-1]
            if nums[pre]>nums[i]:
                dec-=1
            if nums[pre]>s:
                dec+=1
            sl.remove((nums[pre]+nums[i],pre))
            sl.add((nums[pre]+s,pre))
        if k+2<len(ind):
            nxt2=ind[k+2]
            if nums[nxt]>nums[nxt2]:
                dec-=1
            if s>nums[nxt2]:
                dec+=1
            sl.remove((nums[nxt]+nums[nxt2],nxt))
            sl.add((s+nums[nxt2],i))
        nums[i]=s
        ind.remove(nxt)
    return ans

1/24

python 复制代码

1/25

python 复制代码

相关推荐
Swift社区2 小时前
LeetCode 382 链表随机节点
算法·leetcode·链表
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #19:删除链表的倒数第N个结点(双指针、栈辅助法等多种实现方案详细解析)
算法·leetcode·链表·双指针·删除链表节点·一趟扫描
chao_7892 小时前
跳跃游戏系列【贪心算法】
python·算法·游戏·贪心算法·贪心
波波0072 小时前
每日一题:.NET 中什么是 LOH(大对象堆)?为什么频繁使用大数组或大字符串可能导致性能问题?如何优化?
java·jvm·算法
独自破碎E2 小时前
动态规划-正则表达式匹配
算法·正则表达式·动态规划
Gofarlic_OMS2 小时前
Fluent许可证使用合规性报告自动化生成系统
java·大数据·运维·人工智能·算法·matlab·自动化
漫随流水2 小时前
leetcode回溯算法(131.分割回文串)
数据结构·算法·leetcode·回溯算法
我家大宝最可爱2 小时前
强化学习基础-重要性采样
算法·机器学习·概率论
Remember_9932 小时前
文件系统与IO操作:深入解析与Java实践
java·开发语言·数据结构·ide·python·算法