当前位置: 首页 > news >正文

【C++二分查找 前缀和 】1292. 元素和小于等于阈值的正方形的最大边长

本文涉及的基础知识点

C++二分查找
C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频

LeetCode1292. 元素和小于等于阈值的正方形的最大边长

给你一个大小为 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,如图所示。
示例 2:
输入:mat = [[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2],[2,2,2,2,2]], threshold = 1
输出:0
提示:
m == mat.length
n == mat[i].length
1 <= m, n <= 300
0 <= mat[i][j] <= 104
0 <= threshold <= 105

二分查找、前缀和

预处理好前缀和后,可以在O(1)的时间内,计算矩形之和。
二分查找类型:寻找末端
Check函数的参数返回:[1,min(n,m)]
异常处理:如果Check(ret)不成立,则返回0。
Check函数:枚举各矩形的左上角,如果和小于等于阈值,返回true。否则返回false。Check函数的时间复杂度:O(nm)
总时间复杂度:O(log(min(n,m))nm)

代码

核心代码

template<class T = int>
class CPreSum2 {
public:template<class _Pr>CPreSum2(int rowCnt, int colCount, _Pr pr) :m_iRowCnt(rowCnt), m_iColCnt(colCount) {m_vSum.assign(rowCnt + 1, vector<int>(colCount + 1));for (int r = 0; r < rowCnt; r++) {for (int c = 0; c < colCount; c++) {m_vSum[r + 1][c + 1] = m_vSum[r][c + 1] + m_vSum[r + 1][c] - m_vSum[r][c] + pr(r, c);}}}T Get(int left, int top, int right, int bottom)const {return m_vSum[bottom + 1][right + 1] - m_vSum[top][right + 1] - m_vSum[bottom + 1][left] + m_vSum[top][left];}T GetTopLeft(int left, int top) { return Get(left, top, m_iColCnt - 1, m_iRowCnt - 1); }vector<vector<T>> m_vSum;const int m_iRowCnt, m_iColCnt;
};
template<class INDEX_TYPE>
class CBinarySearch
{
public:CBinarySearch(INDEX_TYPE iMinIndex, INDEX_TYPE iMaxIndex):m_iMin(iMinIndex),m_iMax(iMaxIndex) {}template<class _Pr>INDEX_TYPE FindFrist( _Pr pr){auto left = m_iMin - 1;auto rightInclue = m_iMax;while (rightInclue - left > 1){const auto mid = left + (rightInclue - left) / 2;if (pr(mid)){rightInclue = mid;}else{left = mid;}}return rightInclue;}template<class _Pr>INDEX_TYPE FindEnd( _Pr pr){int leftInclude = m_iMin;int right = m_iMax + 1;while (right - leftInclude > 1){const auto mid = leftInclude + (right - leftInclude) / 2;if (pr(mid)){leftInclude = mid;}else{right = mid;}}return leftInclude;}
protected:const INDEX_TYPE m_iMin, m_iMax;
};class Solution {public:int maxSideLength(vector<vector<int>>& mat, int threshold) {m_r = mat.size();m_c = mat.front().size();CPreSum2<int> preSum(m_r, m_c, [&](const int& r, const int& c) {return mat[r][c]; });			auto Check = [&](int mid) {for (int r = 0; r+mid <= m_r; r++) {for (int c = 0; c+mid <= m_c; c++) {const int sum = preSum.Get(c, r, c + mid - 1, r + mid - 1);if (sum <= threshold) { return true; }}}return false;};return CBinarySearch<int>(0, min(m_r, m_c)).FindEnd(Check);}int m_r, m_c;};

单元测试

	vector<vector<int>> mat;int threshold;TEST_METHOD(TestMethod13){mat = { {1,1,3,2,4,3,2},{1,1,3,2,4,3,2},{1,1,3,2,4,3,2} }, threshold = 4;auto res = Solution().maxSideLength(mat, threshold);AssertEx(2, res);}TEST_METHOD(TestMethod14){mat = { {2,2,2,2,2},{2,2,2,2,2},{2,2,2,2,2},{2,2,2,2,2},{2,2,2,2,2} }, threshold = 1;auto res = Solution().maxSideLength(mat, threshold);AssertEx(0, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 主流AI绘画工具StableDiffusion最新模型sd3本地部署方法(附工作流)
  • 螺旋矩阵 II(LeetCode)
  • ros2_control_py 使用教程
  • Java二十三种设计模式-备忘录模式(19/23)
  • SPDY是何方神圣
  • \r和\n不同系统的区别
  • SpringBoot注解大总结
  • 关于Spring Boot的自动配置
  • 《Unity3D网络游戏实战》通用服务器框架
  • Unity动画模块 之 3D模型导入基础设置 Materials
  • 从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革
  • 【PostgreSQL003】PostgreSQL数据表空间膨胀,磁盘爆满,应用宕机(经验总结,已更新)
  • vue项目实现postcss-pxtoremvue大屏适配
  • 【运维】在 CentOS 7 中修改 `http_proxy` 设置
  • 从0-1开发一个Vue3前端系统页面-9.博客页面布局
  • Google 是如何开发 Web 框架的
  • 【Amaple教程】5. 插件
  • 【刷算法】求1+2+3+...+n
  • Angular 2 DI - IoC DI - 1
  • jquery ajax学习笔记
  • mysql中InnoDB引擎中页的概念
  • PAT A1050
  • php的插入排序,通过双层for循环
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • Vue学习第二天
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 批量截取pdf文件
  • 【干货分享】dos命令大全
  • NLPIR智能语义技术让大数据挖掘更简单
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • Unity3D - 异步加载游戏场景与异步加载游戏资源进度条 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • # Redis 入门到精通(七)-- redis 删除策略
  • #70结构体案例1(导师,学生,成绩)
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (27)4.8 习题课
  • (4)STL算法之比较
  • (5)STL算法之复制
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (附源码)spring boot智能服药提醒app 毕业设计 102151
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (强烈推荐)移动端音视频从零到上手(上)
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (状压dp)uva 10817 Headmaster's Headache
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • **《Linux/Unix系统编程手册》读书笔记24章**
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .net 后台导出excel ,word
  • .NET 快速重构概要1
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法