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

LeetCode 3567. 子矩阵的最小绝对差【暴力枚举】中等

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章中,我不仅会讲解多种解题思路及其优化,还会用多种编程语言实现题解,涉及到通用解法时更将归纳总结出相应的算法模板。

为了方便在PC上运行调试、分享代码文件,我还建立了相关的仓库:https://github.com/memcpy0/LeetCode-Conquest。在这一仓库中,你不仅可以看到LeetCode原题链接、题解代码、题解文章链接、同类题目归纳、通用解法总结等,还可以看到原题出现频率和相关企业等重要信息。如果有其他优选题解,还可以一同分享给他人。

由于本系列文章的内容随时可能发生更新变动,欢迎关注和收藏征服LeetCode系列文章目录一文以作备忘。

给你一个m x n的整数矩阵grid和一个整数k

对于矩阵grid中的每个连续的k x k子矩阵,计算其中任意两个不同值 之间的最小绝对差

返回一个大小为(m - k + 1) x (n - k + 1)的二维数组ans,其中ans[i][j]表示以grid中坐标(i, j)为左上角的子矩阵的最小绝对差。

注意:如果子矩阵中的所有元素都相同,则答案为 0。

子矩阵(x1, y1, x2, y2)是一个由选择矩阵中所有满足x1 <= x <= x2y1 <= y <= y2的单元格matrix[x][y]组成的矩阵。

示例 1:

输入: grid=[[1,8],[3,-2]],k=2输出:[[2]]

解释

  • 只有一个可能的k x k子矩阵:[[1, 8], [3, -2]]
  • 子矩阵中的不同值为[1, 8, 3, -2]
  • 子矩阵中的最小绝对差为|1 - 3| = 2。因此,答案为[[2]]

示例 2:

输入: grid=[[3,-1]],k=1输出:[[0,0]]

解释:

  • 每个k x k子矩阵中只有一个不同的元素。
  • 因此,答案为[[0, 0]]

示例 3:

输入: grid=[[1,-2,3],[2,3,5]],k=2输出:[[1,2]]

解释:

  • 有两个可能的k × k子矩阵:
    • (0, 0)为起点的子矩阵:[[1, -2], [2, 3]]
      • 子矩阵中的不同值为[1, -2, 2, 3]
      • 子矩阵中的最小绝对差为|1 - 2| = 1
    • (0, 1)为起点的子矩阵:[[-2, 3], [3, 5]]
      • 子矩阵中的不同值为[-2, 3, 5]
      • 子矩阵中的最小绝对差为|3 - 5| = 2
  • 因此,答案为[[1, 2]]

提示:

  • 1 <= m == grid.length <= 30
  • 1 <= n == grid[i].length <= 30
  • -10^5 <= grid[i][j] <= 10^5
  • 1 <= k <= min(m, n)

解法 暴力枚举

暴力枚举所有子矩形,把子矩形中的所有元素添加到一个数组a aa中,然后把a aa排序。排序后,不同元素之差的最小值一定来自a aa的相邻元素,计算相邻不同元素之差的最小值。

classSolution{publicint[][]minAbsDiff(int[][]grid,intk){intm=grid.length;intn=grid[0].length;int[][]ans=newint[m-k+1][n-k+1];int[]a=newint[k*k];for(inti=0;i<=m-k;i++){for(intj=0;j<=n-k;j++){intidx=0;for(intx=0;x<k;x++){for(inty=0;y<k;y++){a[idx++]=grid[i+x][j+y];}}Arrays.sort(a);intres=Integer.MAX_VALUE;for(intp=1;p<a.length;p++){if(a[p]>a[p-1]){// 题目要求相减的两个数必须不同res=Math.min(res,a[p]-a[p-1]);}}if(res<Integer.MAX_VALUE){ans[i][j]=res;}}}returnans;}}
classSolution{public:vector<vector<int>>minAbsDiff(vector<vector<int>>&grid,intk){intm=grid.size(),n=grid[0].size();vectorans(m-k+1,vector<int>(n-k+1));for(inti=0;i<=m-k;i++){for(intj=0;j<=n-k;j++){vector<int>a;for(intx=0;x<k;x++){for(inty=0;y<k;y++){a.push_back(grid[i+x][j+y]);}}ranges::sort(a);intres=INT_MAX;for(intp=1;p<a.size();p++){if(a[p]>a[p-1]){// 题目要求相减的两个数必须不同res=min(res,a[p]-a[p-1]);}}if(res<INT_MAX){ans[i][j]=res;}}}returnans;}};
classSolution:defminAbsDiff(self,grid:List[List[int]],k:int)->List[List[int]]:m,n=len(grid),len(grid[0])ans=[[0]*(n-k+1)for_inrange(m-k+1)]foriinrange(m-k+1):sub_grid=grid[i:i+k]forjinrange(n-k+1):a=[]forrowinsub_grid:a+=row[j:j+k]a.sort()res=infforx,yinpairwise(a):ifx<y:# 题目要求相减的两个数必须不同res=min(res,y-x)ifres<inf:ans[i][j]=resreturnans
funcminAbsDiff(grid[][]int,kint)[][]int{m,n:=len(grid),len(grid[0])ans:=make([][]int,m-k+1)arr:=make([]int,k*k)fori:=rangeans{ans[i]=make([]int,n-k+1)forj:=rangeans[i]{a:=arr[:0]// 避免反复 makefor_,row:=rangegrid[i:i+k]{a=append(a,row[j:j+k]...)}slices.Sort(a)res:=math.MaxIntforp:=1;p<len(a);p++{ifa[p]>a[p-1]{// 题目要求相减的两个数必须不同res=min(res,a[p]-a[p-1])}}ifres<math.MaxInt{ans[i][j]=res}}}returnans}

复杂度分析:

  • 时间复杂度:O ( ( m − k ) ( n − k ) k 2 log ⁡ k ) O( (m - k) (n - k) k^2 \log k)O((mk)(nk)k2logk),其中m mmn nn分别为g r i d gridgrid的行数和列数。
  • 空间复杂度:O ( k 2 ) O(k^2)O(k2)。返回值不计入。

注:考虑用定长滑动窗口+有序集合+懒删除堆,用有序集合维护窗口(子矩阵)元素,用懒删除堆维护相邻不同元素之差。添加删除时更新相邻不同元素之差。这样可以做到O ( ( m − k ) n k log ⁡ k ) O( (m - k) nk \log k)O((mk)nklogk),但常数比较大。

http://www.jsqmd.com/news/512671/

相关文章:

  • 光储并网系统里,虚拟同步机(VSG)控制是个挺有意思的技术活。今天咱们就拆开看看这玩意怎么把光伏板、储能电池和电网揉在一起玩的,顺便撸点代码助助兴
  • AIGC检测算法更新后AI率飙升?完整应对攻略来了
  • 大模型发展全解析:从Transformer到推理模型,小白也能轻松入门收藏!
  • AI代码生成器选型指南:从Claude Sonnet4的严谨到GLM-4.5的高效(附真实项目适配建议)
  • 排序算法详解1
  • 工业自动化集成商必看:2026年赫斯曼连接器、lumberg插头口碑推荐,一家深耕场景的解决方案专家 - 速递信息
  • 收藏!小白/程序员必看:2026最新国产大模型核心参数对比与学习指南
  • 283. 移动零
  • Iris在日常办公与数字生活中的护眼应用实践与价值分析
  • 半颗星教育电话查询:报名学习前需知事项提醒 - 十大品牌推荐
  • 基于java+springboot微信小程序的废品回收系统的设计与实现
  • [x-cmd] 用 lychee 揪出文档中的无效链接,为 AI 写的文档做质检
  • BERT模型实战:input_ids和attention_mask参数详解与避坑指南
  • 因子分析在社会科学研究中的应用:如何用SPSS挖掘隐藏变量
  • 光伏储能单相离网并网切换仿真模型的构建过程与关键控制策略(包含Boost电路MPPT及扰动观察...
  • 2026.3.20 用EasyExcel实现excel报表的导入与导出
  • AI率飙升到60%以上?这3款降AI工具专治算法升级后的高AI率
  • 未来展望: 当 AGI(通用人工智能)出现,网络安全是否会消失?
  • 设计模式:Go常用设计模式概述
  • MATLAB 2024a最新版MinGW配置避坑指南:从下载到环境变量一键搞定
  • 重塑社区体验:打造无广告干扰的第三方酷安客户端
  • 【2026 最新】一篇文章告诉你什么是Skills 同时 告别Prompt工程!用Claude Skills把AI变成你的专属打工人
  • Thonny新手必看:如何用内置工具一键安装numpy和pygame(附常见错误解决)
  • 2026年geo公司推荐:高端制造与专业服务领域GEO优化技术型伙伴深度解析 - 十大品牌推荐
  • 智慧仓储空间智能管理系统技术方案:基于三维重构与轨迹建模的全流程透明化与智能决策体系
  • 跨境电商图片翻译工具推荐:跨马翻译使用体验分享
  • 2026年有机玻璃制品优质厂家合集,选购不迷茫,亚克力真空箱/有机玻璃加工/亚克力制品,有机玻璃制品供应商有哪些 - 品牌推荐师
  • 保姆级教程:在Apollo 8.0中手把手调试FemPos平滑算法(附U型弯道仿真对比)
  • 规范设计(上):项目开发杂乱无章,如何规范?
  • 计算机毕业设计springboot遇见宠物生活馆系统设计与实现 基于SpringBoot的萌宠驿站综合服务管理平台设计与实现 SpringBoot框架下爱宠家园一站式服务平台的设计与实现