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

力扣1895. 最大的幻方

在这里插入图片描述
在这里插入图片描述
这一题的大意是让我们在一个大的矩阵中找到一个边长最大的正方形,使得该正方形的每一行每一列和两条对角线完全相等。
我们只需要从大到小的枚举边长,在枚举过边长的基础上枚举所有符合该边长的正方形。
在计算每一行每一列的和的时候可以用前缀和来优化
因为如果我们不优化:
枚举边长的大概是O(n),枚举所有符合条件的正方形又是O(n^2)
再计算每一行和列的和的时间复杂度都约等于O(n),
再将每一行,每一列,对角线比较是否相等的时间复杂度也为O(n)。
所以时间复杂度大概为O(n^5)
O(n⁵) = 50⁵ = 312,500,000 ≈ 3.1e8
时间复杂度是比较大的,
因此我们需要对其进行优化,我们会发现,在计算每一行每一列的和的时候,我们可以进行前缀和的优化,即提前算出每一行,每一列的前缀和,这样就不用在枚举矩阵的时候计算每一行或列的和了。
这样时间复杂度也降到了O(n^4),可以通过。
很明显需要知道的是,不管用不用前缀和优化,在遇到矩阵枚举的时候,我们都可以选择前缀和优化,这是一种常用的做法。
因此,这一题的本质就是矩阵枚举问题通常要枚举边长 + 枚举起点。前缀和优化:遇到“重复计算某一行/列/子矩阵和”的情况,第一反应就是前缀和。
完整代码如下:

class Solution {
public:int largestMagicSquare(vector<vector<int>>& grid) {int ans=1;int m=grid.size();int n=grid[0].size();vector<vector<int> > colsum(m,vector<int>(n));vector<vector<int> > rowsum(m,vector<int>(n));for(int i=0;i<m;i++){rowsum[i][0]=grid[i][0];for(int j=1;j<n;j++){rowsum[i][j]=rowsum[i][j-1]+grid[i][j];}}for(int j=0;j<n;j++){colsum[0][j]=grid[0][j];for(int i=1;i<m;i++){colsum[i][j]=colsum[i-1][j]+grid[i][j];}}for(int edge=min(m,n);edge>=2;edge--){for(int i=0;i+edge-1<m;i++){for(int j=0;j+edge-1<n;j++){int stdsum;if(j!=0)stdsum=rowsum[i][j+edge-1]-rowsum[i][j-1];elsestdsum=rowsum[i][j+edge-1]-0;bool flag=0;for(int ii=i+1;ii<=i+edge-1;ii++){int nowsum;if(j!=0)nowsum=rowsum[ii][j+edge-1]-rowsum[ii][j-1];elsenowsum=rowsum[ii][j+edge-1]-0;if(nowsum!=stdsum){flag=1;break;}}if(flag==1){continue;}for(int jj=j;jj<=j+edge-1;jj++){int nowsum;if(i!=0)nowsum=colsum[i+edge-1][jj]-colsum[i-1][jj];elsenowsum=colsum[i+edge-1][jj]-0;if(nowsum!=stdsum){flag=1;break;}}if(flag==1){continue;}int d1=0;int d2=0;for(int k=0;k<edge;k++){d1+=grid[i+k][j+k];d2+=grid[i+k][j+edge-1-k];}if(d1==stdsum&&d2==stdsum){ans=edge;return edge;}}}}return ans;}};

时间复杂度为O(n^4)

http://www.dtcms.com/a/391605.html

相关文章:

  • Linux入门(四)
  • 以下是与LoRa技术相关的数学公式整理
  • (3) rust和前端交互
  • TextFlux重磅发布:告别复杂控制信号!多语种高保真场景文本编辑新时代
  • A股大盘数据-20250919分析
  • [x-cmd] X-CMD 的依赖非常精简,即装即用,无需额外配置
  • TM52F1363 电子元器件 海速芯 8位高性能微控制器(MCU)技术解析
  • 打工人日报#20250919
  • vue3学习日记(十九):组件实例详解
  • 【开题答辩全过程】以 基于python的订餐系统为例,包含答辩的问题和答案
  • 题解:CF2143E Make Good
  • 鸿蒙:使用worker实现多线程通信
  • Spring MVC 常用注解及代码示例
  • 【DMA】DMA入门:外设数据到内存,以串口DMA接收为例,解析底层实现
  • Java 中 super 和 this关键字总结
  • 我的创作纪念日 ----- 第512天
  • 【docker】删除镜像
  • 亚马逊 MWS 关键字 API 实战:关键字搜索商品列表接口深度解析与优化方案
  • 博文干货 | Pulsar 平均负载器(AvgShedder)
  • 【硬件】嘉立创专业版layout流程(一)
  • PyQt6之分组框
  • 深度剖析 IM 单聊与群聊架构设计
  • 农业自动化:技术重塑传统农业的新范式
  • Nginx 日志文件在哪?
  • 小程序开发者转多端应用app调整视频播放功能
  • 九、Java-注解
  • Java学习笔记——AI插件、新建模块、算数运算符类型、隐式转换、强制转换、自增自减运算符、赋值运算符、关系运算符、逻辑运算符、三元运算符
  • 【从零开始刷力扣006】leetcode206
  • FreeRTOS——介绍及移植过程
  • Day 07 Physics list-----以B1为例