记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步
目录
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