矩阵简单问题(Java)
问题: 顺时针打印二维方阵:
1 2 3 4 15
5 6 7 8 14
9 10 11 12 13
13 14 15 16
public class Test1 {public static void main(String[] args) {int[][] arr = new int[][]{{1, 2, 3, 4,100},{5, 6, 7, 8,101},{9, 10, 11, 12,102},{13, 14, 15, 16,103}};f1(arr);}static void f1(int[][] arr) {int leftRow = 0, leftCol = 0; //左上int rightRow = arr.length - 1, rightCol = arr[0].length - 1; //右下while (leftRow <= rightRow && leftCol <= rightCol) {for (int i = leftCol; i <= rightCol; i++) {System.out.print(arr[leftRow][i] + " ");}for (int i = leftRow + 1; i <= rightRow; i++) {System.out.print(arr[i][rightCol] + " ");}for (int i = rightCol - 1; i >= leftCol; i--) {System.out.print(arr[rightRow][i] + " ");}for (int i = rightRow - 1; i > leftRow; i--) {System.out.print(arr[i][leftCol] + " ");}leftRow++;leftCol++;rightRow--;rightCol--;}}
}
问题:0所在的行和列清零
1 2 3 4
6 0 7 8
9 10 0 11
只能先遍历一遍记录下0的位置,然后在改0
public class Test1 {public static void main(String[] args) {int[][] arr = new int[][]{{1, 2, 3, 4,100},{5, 6, 0, 8,101},{9, 10, 11, 0,102},{13, 14, 15, 16,103}};f2(arr);for (int[] ints : arr) {for (int i : ints) {System.out.print(i+" ");}System.out.println("");}}static void f2(int[][] arr){int m = arr.length,n = arr[0].length;int[] row = new int[m];int[] col = new int[n];for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(arr[i][j] == 0){row[i]=1;col[j]=1;}}}for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(row[i]==1 || col[j]==1){arr[i][j]=0;}}}}
}
问题:“Z”型打印
1,2, 3, 4
5,6, 7, 8
9,10,11,12 结果为1 2 5 9 6 3 4 7 10 11 8 12
public class Test1 {public static void main(String[] args) {int[][] arr = new int[][]{{1,2, 3, 4},{5,6, 7, 8},{9,10,11,12}};f3(arr);}static void f3(int[][] arr){int row = 0,m = arr.length;int col = 0,n = arr[0].length;boolean flag = true; //控制是斜向上打印还是斜向下打印while(row<m && col<n){if(flag){System.out.print(arr[row][col]+" ");if(row==0 && col <n-1){ //斜上打印,碰到上端,就打印右边的,然后在斜向下col++;flag=false;} else if (row>0 && col== n-1) {//斜上打印,碰到右端,就打印下边的,然后在斜向下row++;flag=false;}else {row--;col++;}}else {System.out.print(arr[row][col]+" ");if(col==0 && row < m-1){ //斜下打印,碰到左端,就打印下边的,然后在斜向上row++;flag=true;} else if (col > 0 && row == m - 1) {//斜下打印,碰到下端,就打印右边的,然后在斜向上col++;flag=true;}else {row++;col--;}}}}
}
给定一个n*n矩阵,值只有0和1 返回边框为1的最大正方形的边长长度
0,1,1,1,1
0,1,0,0,1
0,1,0,0,1
0,1,1,1,1
0,1,0,1,1 返回4
public class Test1 {public static void main(String[] args) {int[][] arr = new int[][]{{0,1,1,1,1},{0,1,0,0,1},{0,1,0,0,1},{0,1,1,1,1},{0,1,0,1,1}};System.out.println(f4(arr));}static int f4(int[][] arr){int n = arr.length;helper(arr);while(n>=1){for(int i=0;i<arr.length;i++){for(int j=0;j<arr.length;j++){if(i+n>arr.length || j+n>arr.length){continue;}/*if(test(arr,i,j,n)){return n;}*/if(help[i][j][0]>=n && help[i][j][1]>=n && help[i][j+n-1][1]>=n && help[i+n-1][j][0]>=n)return n;}}n--;}return 0;}static int[][][] help; // 0为右边1的个数,1为下面1的个数//构建三维数组,维护每一元素1的个数static void helper(int[][] arr){int n=arr.length;help=new int[n][n][2];int row= n-1;//先填充好最下面的一行for(int j=n-1;j>=0;j--){int value = arr[row][j];if(value==1){if(j==n-1)help[row][j][0]=1;else help[row][j][0]=help[row][j+1][0]+1;help[row][j][1]=1;}}row--;//在逐渐向上遍历for (int i=row;i>=0;i--){for(int j=n-1;j>=0;j--){int value = arr[i][j];if(value==1){if(j==n-1)help[i][j][0]=1;else help[i][j][0]=help[i][j+1][0]+1;help[i][j][1]=help[i+1][j][1]+1;}}}}
}
问题:求最大子矩阵累加和,其值有正、有负、有0,返回子矩阵的最大累加和
解法:将矩阵中每行的相同列的元素逐渐相加,转化为 无序的一维数组求最大连续累加和。
那么我们先求一个一维无序数组arr,返回arr中子数组(连续)的最大累加和。
public class Test2 {public static void main(String[] args) {}static int f1(int[] arr){if(arr.length==0) return 0;int sum=arr[0],max=arr[0];int left = 0, right = 0;for(int i=1;i<arr.length;i++){if(sum<=0){sum=arr[i];left=i;//这里不能用continue,因为不能保证最大累加和大于0,可能每个元素都小于0.}else sum+=arr[i];if(sum>max){max=sum;right=i;}}System.out.println("left="+left+" ,right="+right);return max;}
}
然后按列求和,维护一个sum数组,sum[i]为第i列的元素求和,先是从第0行到最后一行的所有列求和,每加一次,求一次sum数组的最大子序列。然后在清空sum,然后在是第1行到最后一行的所有列求和,每次求和,求一次sum数组的最大子序列,然后在从第2行开启,直到遍历完所有行。
public class Test2 {public static void main(String[] args) {int[][] arr = new int[][]{{-90,48,78},{64,-40, 64},{-81,-7,66}};System.out.println(f2(arr));}static int f1(int[] arr){if(arr.length==0) return 0;int sum=arr[0],max=arr[0];int left = 0, right = 0;for(int i=1;i<arr.length;i++){if(sum<=0){sum=arr[i];left=i;//这里不能用continue,因为不能保证最大累加和大于0,可能每个元素都小于0.}else sum+=arr[i];if(sum>max){max=sum;right=i;}}System.out.println("left="+left+" ,right="+right);return max;}static int f2(int[][] arr){int row = 0; //从第一行作为起始行int m = arr.length;int n = arr[0].length;//按列求和int[] sums = new int[m];int max=0; //历史子矩阵累加和while(row<m){for(int i=row;i<m;i++){for(int j=0;j<n;j++){sums[j]+=arr[j][i];}//累加完成//求无序一维数组的最大连续累加和int t = f1(sums);max=Math.max(max,t);}//以下一行作为起始行,Arrays.fill(sums,0);row++;}return max;}
}
相关文章:
矩阵简单问题(Java)
问题: 顺时针打印二维方阵: 1 2 3 4 15 5 6 7 8 14 9 10 11 12 13 13 14 15 16 public class Test1 {public static void main(String[] args) {int[][] arr new int[][]{{1, 2, 3, 4,100},{5, 6, 7, 8,101},{9, 10, 11, 12,102},{13, 14, 15, 16,…...
Elasticsearch DSL版
文章目录 1.索引库操作创建索引库:删除索引库:查询索引库:修改索引库:总结 2.文档操作创建文档:查询文档:删除文档:全量修改文档:增量修改文档:总结 3.DSL查询语法&#…...
2024-12-29-sklearn学习(26)模型选择与评估-交叉验证:评估估算器的表现 今夜偏知春气暖,虫声新透绿窗纱。
文章目录 sklearn学习(26) 模型选择与评估-交叉验证:评估估算器的表现26.1 计算交叉验证的指标26.1.1 cross_validate 函数和多度量评估26.1.2 通过交叉验证获取预测 26.2 交叉验证迭代器26.2.1 交叉验证迭代器–循环遍历数据26.2.1.1 K 折26.2.1.2 重复 K-折交叉验…...
STM32CUBEIDE FreeRTOS操作教程(十二):std dynamic memory 标准动态内存
STM32CUBEIDE FreeRTOS操作教程(十二):std dynamic memory 标准动态内存 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件,不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F40…...
异步爬虫之aiohttp的使用
在上一篇博客我们介绍了异步爬虫的基本原理和 asyncio 的基本用法,并且在最后简单提及了使用aiohttp 实现网页爬取的过程。本篇博客我们介绍一下 aiohttp 的常见用法。 基本介绍 前面介绍的 asyncio模块,其内部实现了对 TCP、UDP、SSL协议的异步操作&a…...
【Rust自学】9.1. 不可恢复的错误以及panic!
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 9.1.1. Rust错误处理概述 Rust拥有极高的可靠性,这也延伸到了错误处理的领域。比如说在大部分情况下,Rust会迫使你…...
【老张的程序人生】一天时间,我成软考高级系统分析师
今年下半年,我心血来潮报考了软考高级系统分析师。彼时的我,工作繁忙至极,一周十四节课,班主任的职责压身,还兼任教学管理事务,每日忙得晕头转向,那点可怜的闲暇时光,也都奉献给了游…...
vue使用el-select下拉框自定义复选框
在 Vue 开发中,高效且美观的组件能极大地提升用户体验和开发效率。在vue中使用elementplus 的 el-select下拉框实现了一个自定义的多选下拉框组件。 一、代码功能概述 这段代码创建了一个可多选的下拉框组件,通过el-select和el-checkbox-group结合的方…...
k8s基础(2)—Kubernetes-Namespace
一、Namespace概述 名字空间 在 Kubernetes 中,名字空间(Namespace) 提供一种机制,将同一集群中的资源划分为相互隔离的组。 同一名字空间内的资源名称要唯一,但跨名字空间时没有这个要求。 名字空间作用域仅针对带有…...
APM for Large Language Models
APM for Large Language Models 随着大语言模型(LLMs)在生产环境中的广泛应用,确保其可靠性和可观察性变得至关重要。应用性能监控(APM)在这一过程中发挥了关键作用,帮助开发者和运维人员深入了解LLM系统的…...
Spark Runtime Filter
Runtime Filter 参考链接: https://docs.google.com/document/d/16IEuyLeQlubQkH8YuVuXWKo2-grVIoDJqQpHZrE7q04/edit?tabt.0https://www.modb.pro/db/557718https://issues.apache.org/jira/browse/SPARK-32268https://github.com/apache/spark/pull/35789https…...
AI大模型系列之七:Transformer架构讲解
目录 Transformer网络是什么? 输入模块结构: 编码器模块结构: 解码器模块: 输出模块结构: Transformer 具体是如何工作的? Transformer核心思想是什么? Transformer的代码架构 自注意力机制是什么…...
基于51单片机(STC12C5A60S2)和8X8彩色点阵屏(WS2812B驱动)的小游戏《贪吃蛇》(普中开发板矩阵按键控制)
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、定时器02、矩阵按键3、8X8彩色点阵屏 四、主函数总结 系列文章目录 前言 《贪吃蛇》,一款经典的、怀旧的小游戏,单片机入门必写程序。 以《贪吃蛇》为载体,熟悉各种屏幕的使…...
遇到复杂的 递归查询sql 需要oracle 转pgsql 可以把数据表结构给ai
遇到复杂的 递归查询sql 需要oracle 转pgsql 可以把数据表结构给ai 并且 建立备份表 把需要的很少的数据放到表里面 这样 ai 可以很好的判断sql 咋写 还可以,让ai解释oracle sql 然后拿到描述和表和字段,给ai让他生成pgsql 的sql,亲测有效...
Zynq PS端外设之GPIO
1. GPIO(通用输入/输出) GPIO外设有4个Bank,Bank0/1通过MIO连接到PS的引脚上;Bank2/3通过EMIO连接到PL的引脚上。 注意:Bank1的电平要改成LVCOMS 1.8 GPIO寄存器 寄存器: DATA_RO: 读取GPIO的输…...
Spring Boot项目开发常见问题及解决方案(上)
启动相关问题 问题 1:项目启动时报错“找不到主类” 在使用 Spring Boot 打包成可执行 JAR 文件后启动,有时会遇到这个头疼的问题。通常是因为打包配置有误或者项目结构不符合要求。 解决方案: 首先,检查 pom.xml(Ma…...
Elasticsearch: 高级搜索
这里写目录标题 一、match_all匹配所有文档1、介绍: 二、精确匹配1、term单字段精确匹配查询2、terms多字段精确匹配3、range范围查询4、exists是否存在查询5、ids根据一组id查询6、prefix前缀匹配7、wildcard通配符匹配8、fuzzy支持编辑距离的模糊查询9、regexp正则…...
STM32 拓展 电源控制
目录 电源控制 电源框图 VDDA供电区域 VDD供电区域 1.8V低电压区域 后备供电区域 电压调节器 上电复位和掉电复位 可编程电压检测器(PVD) 低功耗 睡眠模式(只有CUP(老板)睡眠) 进入睡眠模式 退出睡眠模式 停机(停止)模式(只留核心区域(上班)) 进入停…...
SpringBootWeb案例-1
文章目录 SpringBootWeb案例1. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理2.1 查询部门2.1.1 原型和需求2.1.2 接口文档2.1.3 思路分析2.1.4 功能开发2.1.5 功能测试 2.2 前后端联调2.3 删除部门2.3.1 需求2.3.2 接口文档2.3.3 思路…...
HTML——57. type和name属性
<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>type和name属性</title></head><body><!--1.input元素是最常用的表单控件--><!--2.input元素不仅可以在form标签内使用也可以在form标签外使用-…...
3D元器件库在PCB设计中的关键作用与应用
1. 为什么你需要一套完整的3D元器件库作为一名电子工程师,我深知在PCB设计过程中,3D元器件库的重要性。传统的2D设计虽然能满足基本需求,但在实际生产装配时往往会遇到各种意想不到的机械干涉问题。记得我刚开始做硬件设计时,就曾…...
合肥艺星12周年超级盛典 以“独1无2”之名,立品质医美新坐标
2026年4月1日,合肥艺星12周年超级盛典正式启幕。十二年,不只是时间的沉淀,更是品牌在品质、技术、服务、标准、态度、团队、城市责任与星品矩阵八大维度上,构建完整“坐标系”的高光时刻。合肥艺星以“独1无2”之姿,向安徽乃至全国医美行业定义出一份关于“独一”的答卷。独1无…...
拯救者笔记本性能优化终极指南:如何用Lenovo Legion Toolkit释放硬件潜力
拯救者笔记本性能优化终极指南:如何用Lenovo Legion Toolkit释放硬件潜力 【免费下载链接】LenovoLegionToolkit Lightweight Lenovo Vantage and Hotkeys replacement for Lenovo Legion laptops. 项目地址: https://gitcode.com/gh_mirrors/le/LenovoLegionTool…...
iPhone上跑Transformer太慢?试试EfficientFormer-L1,实测延迟比MobileViT快一倍
iPhone端Transformer模型加速实战:EfficientFormer-L1性能优化解析 移动端AI开发者常面临一个核心矛盾:如何在有限的计算资源下,既保持模型精度又实现实时推理?传统方案往往需要在MobileNet等轻量卷积网络和视觉Transformer&#…...
告别模糊:手把手教你用LAMBDA算法搞定GNSS整周模糊度(附Python代码示例)
告别模糊:手把手教你用LAMBDA算法搞定GNSS整周模糊度(附Python代码示例) 当你在开发高精度定位系统时,是否曾被整周模糊度问题困扰?这个看似简单的整数解问题,实际上影响着厘米级定位的成败。作为GNSS领域的…...
CryptoJS不同加密模式对比:AES-CBC vs GCM在前端安全中的选择指南
AES加密模式深度解析:CBC与GCM在前端安全中的实战抉择 前端开发者在处理用户敏感数据时,AES加密已成为标配技术方案。但在具体实施过程中,加密模式的选择往往成为决策难点——是选择经典的CBC模式,还是拥抱更现代的GCM模式&#x…...
Pixel Aurora Engine真实案例:用‘蒸汽朋克猫武士’生成整套游戏美术资源
Pixel Aurora Engine真实案例:用蒸汽朋克猫武士生成整套游戏美术资源 1. 项目背景与工具介绍 Pixel Aurora Engine(像素极光引擎)是一款基于AI扩散模型的高端像素艺术生成工具。它采用复古的8-bit游戏机风格界面,却能产出专业级…...
Android定时开关机的5种实现方式对比:哪种最适合你的设备?
Android定时开关机技术全景解析:从系统API到硬件层控制的深度实践 在智能设备管理领域,定时开关机功能一直是工业控制、物联网终端和定制化Android设备的核心需求之一。想象一下,你正在部署一批智能售货机,需要在营业时间自动唤醒…...
Unity URP 中 Mipmap 纹理多级渐远技术 解决远处纹理闪烁(摩尔纹)与性能优化的完整指南
什么是 Mipmap?Mipmap(多重贴图渐远技术)是一种经典的纹理渲染优化技术。它为每张纹理生成一系列预计算的缩小版本,从原始分辨率开始,逐级缩小至 11 像素。工作原理当 3D 场景中的物体远离摄像机时,其在屏幕…...
07-打造个性化 AI 助手
OpenClaw 第七篇:记忆系统进阶——打造个性化 AI 助手 “Memory is the treasury and guardian of all things.” — Cicero 在人工智能领域,有一个永恒的挑战:如何让 AI 记住「我是谁」、「你是谁」,以及「我们之前聊过什么」。OpenClaw 作为新一代 AI 自动化平台,构建了…...
