C++前缀和算法应用:矩形区域不超过 K 的最大数值和

news/2024/7/7 22:46:22

基础知识点

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例

题目

给你一个 m x n 的矩阵 matrix 和一个整数 k ,找出并返回矩阵内部矩形区域的不超过 k 的最大数值和。
题目数据保证总会存在一个数值和不超过 k 的矩形区域。
示例 1:
输入:matrix = [[1,0,1],[0,-2,3]], k = 2
输出:2
解释:蓝色边框圈出来的矩形区域 [[0, 1], [-2, 3]] 的数值和是 2,且 2 是不超过 k 的最大数字(k = 2)。
示例 2:
输入:matrix = [[2,2,-1]], k = 3
输出:3

提示:
m == matrix.length
n == matrix[i].length
1 <= m, n <= 100
-100 <= matrix[i][j] <= 100
-105 <= k <= 105

分析

二维前缀和

vPreSum[r][c] 记录以(0,0)开始,宽高为c r的矩形和。vPreSum[r][c] = vPreSum[r - 1][c] + vPreSum[r][c - 1] + matrix[r - 1][c - 1] - vPreSum[r - 1][c - 1];
在这里插入图片描述

vPreSum[r - 1][c]绿色实心矩形的和
vPreSum[r][c - 1]蓝色空心矩形
matrix[r - 1][c - 1]黄色矩形
vPreSum[r - 1][c - 1]蓝绿重叠部分

时间复杂度O(nnn*logn)

枚举所有矩形,时间复杂度是O(n^4),超时。三层循环,第一层和第二层循环,枚举左右。第三层循环枚举下,setSum记录了所有合法的t的构成的矩形(left,0,right,t-1)的和。显然iLeftRight - setSum任意元素的值,就是(left,t,right,row)矩形的和。iLeftRight 是矩形(left,0,right,row)的和。对setSum 进行二分。

源码

class Solution {
public:
int maxSumSubmatrix(vector<vector>& matrix, int k) {
m_r = matrix.size();
m_c = matrix.front().size();
vector<vector> vPreSum(m_r+1,vector(m_c+1,0)); //vPreSum[r][c] 以(0,0)开始,宽高为c r的矩形
for (int r = 1; r <= m_r; r++)
{
for (int c = 1; c <= m_c; c++)
{
//令r=1,c=1 vPreSum[1][1] = 0 +0 + matrix[0][0] -0
//令r=2,c=2 vPreSum[2][2] = vPreSum[1][2] +vPreSum[2][1] + matrix[1][1] + vPreSum[1][1]
vPreSum[r][c] = vPreSum[r - 1][c] + vPreSum[r][c - 1] + matrix[r - 1][c - 1] - vPreSum[r - 1][c - 1];
}
}
int iMin = INT_MIN;
//vector<vector> vDebug(m_r, vector(m_c,INT_MIN));
for (int left = 0; left < m_c ; left++ )
{
for (int right = left ; right < m_c; right++ )
{
//row和right 是右下角的坐标
set setSum = { 0 };
for (int row = 0; row < m_r; row++)
{
const int iLeftRight = vPreSum[row + 1][right + 1]

  • vPreSum[row + 1][left];
    //iLeftRight - x <=k ==> -x <= k - iLeftRight ==> x >= iLeftRight-k
    auto it = setSum.lower_bound(iLeftRight - k);
    if (setSum.end() != it)
    {
    iMin = max(iMin, iLeftRight - *it);
    //vDebug[row][right] = iLeftRight - *it;
    }
    setSum.emplace(iLeftRight);
    }
    }
    }
    return iMin;
    }
    int m_r, m_c;
    };

测试用例

template
void Assert(const vector& v1, const vector& v2)
{
if (v1.size() != v2.size())
{
assert(false);
return;
}
for (int i = 0; i < v1.size(); i++)
{
assert(v1[i] == v2[i]);
}
}

template
void Assert(const T& t1, const T& t2)
{
assert(t1 == t2);
}
int main()
{
vector<vector> matrix = { {1, 2, 3}, { 4,5,6 } };
int k = 2;
auto res = Solution().maxSumSubmatrix(matrix, k);
Assert(res, 2);
matrix = { {1, 0, 1}, { 0,-2,3 } };
k = 2;
res = Solution().maxSumSubmatrix(matrix, k);
Assert(res, 2);
matrix = { {2,2,-1} };
k = 3;
res = Solution().maxSumSubmatrix(matrix, k);
Assert(res, 3);
CConsole::Out(res);
}

扩展阅读

视频课程

有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771

如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

相关下载

想高屋建瓴的学习算法,请下载《闻缺陷则喜算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653

鄙人想对大家说的话
闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
墨家名称的来源:有所得以墨记之。
如果程序是一条龙,那算法就是他的是睛

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17


http://lihuaxi.xjx100.cn/news/1625143.html

相关文章

将 vue2+ElementU 项目打包成安卓app

目标&#xff1a;将vue项目打包成安卓app 工具&#xff1a;HbuilderX 1.在HbuilderX中创建一个 5App 项目 创建好的app项目目录 2.将vue项目打包 2.1 在 vue.config.js 中添加公共路径&#xff08;解决打包后的app图片不显示问题&#xff09; module.exports defineConfig(…

在自己的摄像头上测试ORB_SLAM3

文章目录 硬件相机标定IMU标定依赖编译可能遇到的问题 硬件 x86电脑realsense d435i相机 相机标定 IMU标定 依赖 Ceres # CMake sudo apt-get install cmake # google-glog gflags sudo apt-get install libgoogle-glog-dev libgflags-dev # BLAS & LAPACK sudo apt…

nginx的正向代理,反向代理和负载均衡

nginx当中有两种代理方式以及含义&#xff1a; 1.七层代理 &#xff08;http协议&#xff09; 核心&#xff1a;代理的是http的请求和响应 客户端请求代理服务器&#xff1a;由代理服务器转发客户端的httpd请求&#xff0c;转发到内部的服务器&#xff08;可以是单台和可以是一…

助力森林火情预警检测,基于YOLOv7-tiny、YOLOv7和YOLOv7x开发构建无人机航拍场景下的森林火情检测是别预警系统

火情的预警与检测识别对于保障林业安全&#xff0c;减少人员伤亡有着重要的意义&#xff0c;科学有效地早发现早扑灭是最有效的干预手段&#xff0c;本文的主要是想就是想要建立基于无人机航拍场景下的森林火情检测预警系统&#xff0c;整体效果如下所示&#xff1a; 这里文中选…

港联证券:从AI到华为产业链 主流基金为何屡屡错过新科技

干流基金“踏空”科技股 本年以来&#xff0c;较少有干流基金司理拥抱从AI到华为工业链的科技股&#xff0c;除非基金产品合同“强制”买进。 Wind数据显示&#xff0c;截至目前&#xff0c;本年以来基金产品收益率最高的已超50%&#xff0c;年内收益超15%的基金产品也有数十…

dubbo-admin 2.5.3源码编译

dubbo-admin 2.5.3 属于10年前的产品&#xff0c;当时官方阿里采用1.7版本的jdk进行项目编译&#xff0c;目前在项目中至少使用1.8版本的jdk&#xff0c;导致dubbo-admin 2.5.3在项目中需单独配置一套1.7版本的jdk。对着信创产业的推荐&#xff0c;在arm机器上无法查询到1.7版本…

samba服务器的功能是什么

Samba服务器是一个开源的网络文件共享服务&#xff0c;其主要功能是在不同操作系统之间实现文件和打印机共享。它最常用于将Linux/Unix系统与Windows系统互联&#xff0c;但也支持其他操作系统。 以下是Samba服务器的主要功能&#xff1a; 文件共享&#xff1a;Samba允许用户在…

MongoDB索引操作

1、创建索引 语句&#xff1a; db.collection.createIndex(keys, options, commitQuorum) 选项参数名类型描述keys 包含排序字段和排序方式的对象&#xff0c; 值&#xff1a; 1为升序索引 -1为降序索引 options参数控制对象backgroundboolean 可选&#xff0…