363. 矩形区域不超过 K 的最大数值和

本文介绍了一个算法问题,即在一个给定的二维矩阵中找到不大于特定整数k的最大矩形和。通过使用滑动窗口技术和前缀和的概念,文章详细阐述了如何高效地解决这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。

示例:

输入: matrix = [[1,0,1],[0,-2,3]], k = 2
输出: 2 
解释: 矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。

说明:

  1. 矩阵内的矩形区域面积必须大于 0。
  2. 如果行数远大于列数,你将如何解答呢?

Reviewer:

我又读错了题...我求成了最大面积...

心累...

强调一下这个findmax方法,很精妙~


 

Code:

class Solution {
        public int maxSumSubmatrix(final int[][] matrix, int k) {
            if (matrix.length == 0) return 0;
            int row = matrix.length, col = matrix[0].length, max = Integer.MIN_VALUE;
            for (int i = 0; i < col; i++) {
                int[] sum = new int[row];
                for (int j = i; j < col; j++) {
                    for (int m = 0; m < row; m++) {
                        sum[m] += matrix[m][j];
                    }
                    max = Math.max(max, findMax(sum, k));
                }
            }
            return max;
        }

        private static int findMax(int[] sum, int k) {
            int cum = 0, max = Integer.MIN_VALUE;
            TreeSet<Integer> set = new TreeSet<>();
            set.add(0);
            for (int i = 0; i < sum.length; i++) {
                cum += sum[i];
                Integer gap = set.ceiling(cum - k);
                if (gap != null) max = Math.max(max, cum - gap);
                set.add(cum);
            }
            return max;
        }
}

 

时间限制:3 秒 / 内存限制:1024 MiB 分数 : 积分 525 问题陈述 您将获得一个网格,其中每个单元格都包含 或 。 有关每个单元格中写入的符号的信息以 length 字符串的形式给出,其中从顶部开始的 -th row 从左开始的 -th 列中的单元格包含与 的 -th 字符相同的符号。 查找此网格中满足以下所有条件的矩形区域的数量: H×W#. H S 1 ​ ,S 2 ​ ,…,S H ​ W i j j S i ​ 矩形区域中包含的单元格数包含的单元格数相等。#. 形式上,满足以下所有条件的整数的四元组的个数: (u,d,l,r) 1≤u≤d≤H 1≤l≤r≤W 从顶部从第 -行到第 -行以及从左侧从第 -列到第 -列提取网格部分时,提取部分中包含的单元格数包含的单元格数相等。 u d l r#. 您将获得测试用例。找到他们每个人的答案。 T 约束 1≤T≤25000 1≤H,W 一个输入中所有测试用例的总超过 。 H×W 3×10 5 S i ​ 是一个长度为 的字符串,由 组成。 W#. 输入 输入来自标准输入,格式如下: T case 1 ​ case 2 ​ ⋮ case T ​ case i ​ 表示第 -th 个测试用例。 每个测试用例都按以下格式给出: i H W S 1 ​ S 2 ​ ⋮ S H ​ 输出 输出线。第 -th 行应包含第 -th 测试用例的答案。 T i i 样本输入 1 复制 3 3 2 ## #. .. 6 6 ..#... ..#..# #.#.#. .###.. ###### .###.. 15 50 .......................#...........###.###.###.### ....................#..#..#..........#.#.#...#.#.. .................#...#####...#.....###.#.#.###.### ..................#..##.##..#......#...#.#.#.....# ...................#########.......###.###.###.### ....................#.....#....................... .###........##......#.....#..#...#.####.####.##..# #..#.........#......#.....#..#...#.#....#....##..# #..#.........#......#.....#..#...#.#....#....##..# #.....##...###..##..#.....#..#...#.#....#....#.#.# #....#..#.#..#.#..#.#..##.#..#...#.####.####.#.#.# #....#..#.#..#.####.#....##..#...#.#....#....#.#.# #....#..#.#..#.#....#.....#..#...#.#....#....#..## #..#.#..#.#..#.#..#.#....#.#.#...#.#....#....#..## .##...##...####.##...####..#..###..####.####.#..## 示例输出 1 复制 4 79 4032 此 input 包含测试用例。 3 对于 st 情况,以下矩形区域满足问题陈述中的条件: 1 4 从顶部开始的 st 行到 nd,从左侧开始的 nd 到 nd 列 1 2 2 2 从顶部到 nd 行,从左侧开始从 st 到 st 列 2 3 1 1 从顶部开始的 nd 到 nd 行,从左侧开始从 st 到 nd 列 2 2 1 2 从顶部开始的 st 到 rd 行,从左侧开始从 st 到 nd 列 1 3 1 2
最新发布
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值