矩阵区域不超过K的最大值和

矩阵区域不超过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:0col,r:lcol),每次计算 l − r l-r lr对应区域每一行的和,记为 r o w _ s u m row\_sum row_sum r o w _ s u m row\_sum row_sum的最大连续子数组和(小于等于 k k k)即为最后结果。

在这里插入图片描述

  1. 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
  1. 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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值