矩阵区域不超过K的最大值和
问题描述: 给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。题目数据保证总会存在一个数值和不超过 k 的矩形区域。
输入:matrix = [[1,0,1],[0,-2,3]], k = 2
输出:2
输入:matrix = [[2,2,-1]], k = 3
输出:3
思路:记 l , r l , r l,r分别为matrix的可移动左右边界( l : 0 − c o l , r : l − c o l l:0-col, r: l-col l:0−col,r:l−col),每次计算 l − r l-r l−r对应区域每一行的和,记为 r o w _ s u m row\_sum row_sum, r o w _ s u m row\_sum row_sum的最大连续子数组和(小于等于 k k k)即为最后结果。
- max_submatrix(): 返回矩阵内部矩形区域的不超过 k 的最大数值和。
# python
def max_submatrix(maxtrix: list[list[int]], k: int) -> int:
max_value = -1e+9
row, col = len(maxtrix), len(maxtrix[0])
for i in range(col):
row_sum = [0]*row
for j in range(i, col):
for index in range(row):
row_sum[index] += maxtrix[index][j]
# max_sum_le_k(): 返回数组最大的小于等于k的子序列和
max_value = max(max_sum_le_k(row_sum, k), max_value)
if max_value == k:
return k
return max_value
- max_sum_le_k(): 返回数组最大的小于等于 k k k的子序列和(暴力。。。)
def max_sum_le_k(arr: list[int], k: int) -> int:
# return 最大的小于等于k的子序列和
if not arr:
return -100000
ans, pre, now = -1e+9, 0, 0
for i in range(len(arr)):
now = max(arr[i]+pre, arr[i])
ans = max(now, ans)
pre = now
if ans <= k:
return ans
ans = -1e+9
for i in range(len(arr)):
now = 0
for j in range(i, len(arr)):
now += arr[j]
if ans < now <= k:
ans = now
if ans == k:
return k
return ans
if __name__ == '__main__':
matrix = [[1,0,1],[0,-2,3]]
k = 2
print(max_submatrix(matrix, k))
result:
2