①
难度中等66收藏分享切换为英文接收动态反馈
给你一个大小为 m x n
的矩阵 mat
和一个整数阈值 threshold
。
请你返回元素总和小于或等于阈值的正方形区域的最大边长;如果没有这样的正方形区域,则返回 0 。
示例 1:
输入:mat = [[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]], threshold = 4
输出:2
解释:总和小于或等于 4 的正方形的最大边长为 2,如图所示。
p[i][j] 为0,0 到i,j的和,p[x2][y2]-p[x2][y1-1]-p[x1-1][y2]+p[x1-1][y1-1]为x1,y1到x2,y2的和,采用二分查找,左右边界l,r,边长ans,如果所获边长小于阈值,中间值mid往右走,若大于阈值往左走
class Solution:
def maxSideLength(self, mat: List[List[int]], threshold: int) -> int:
m=len(mat)
n=len(mat[0])
p=[[0]*(n+1) for _ in range(m+1)]
# print(p)
# p[0][0]=mat[0][0]
for i in range(1,m+1):
for j in range(1,n+1):
# if i==0 and j==0:
# p[0][0]=mat[0][0]
# if i!=0 and j==0:
# p[i][j]=p[i-1][j]+mat[i][j]
# if i==0 and j!=0:
# p[i][j]=mat[i][j]+p[i][j-1]
# if i!=0 and j!=0:
p[i][j]=mat[i-1][j-1]+p[i][j-1]+p[i-1][j]-p[i-1][j-1]
def getinfix(x1,y1,x2,y2):
suma=p[x2][y2]-p[x2][y1-1]-p[x1-1][y2]+p[x1-1][y1-1]
return suma
l,r,res=1,min(m,n),0
while l<=r:
mid=(l+r)//2
find=any(getinfix(i,j,i+mid-1,j+mid-1)<=threshold for i in range(1,m-mid+2) for j in range(1,n-mid+2))
if find:
res=mid
l=mid+1
else:
r=mid-1
return res
②
难度中等90收藏分享切换为英文接收动态反馈
给你一个 m x n
的矩阵 mat
和一个整数 k
,请你返回一个矩阵 answer
,其中每个 answer[i][j]
是所有满足下述条件的元素 mat[r][c]
的和:
i - k <= r <= i + k,
j - k <= c <= j + k
且(r, c)
在矩阵内。
示例 1:
输入:mat = [[1,2,3],[4,5,6],[7,8,9]], k = 1
输出:[[12,21,16],[27,45,33],[24,39,28]]
class Solution:
def matrixBlockSum(self, mat: List[List[int]], k: int) -> List[List[int]]:
m=len(mat)