java算法学习索引之数组矩阵问题

一 将正方形矩阵顺时针转动90°

给定一个N×N的矩阵matrix,把这个矩阵调整成顺时针转动90°后的形式。

顺时针转动90°后为:

【要求】额外空间复杂度为O(1)。

public void rotate(int[][] matrix) {int tR = 0; // 左上角行坐标int tC = 0; // 左上角列坐标int dR = matrix.length - 1; // 右下角行坐标int dC = matrix[0].length - 1; // 右下角列坐标while (tR < dR) { // 循环条件:左上角坐标不能超过右下角坐标rotateEdge(matrix, tR++, tC++, dR--, dC--); // 旋转每一层}
}private void rotateEdge(int[][] matrix, int tR, int tC, int dR, int dC) {int times = dC - tC; // 当前层的元素个数int tmp = 0; // 用于交换的中间变量for (int i = 0; i < times; i++) { // 循环遍历当前层的元素tmp = matrix[dR][tC + i];matrix[tR][tC + i] = matrix[dR - i][tC];matrix[dR - i][tC] = matrix[dR][dC - i];matrix[dR][dC - i] = matrix[tR + i][dC];matrix[tR + i][dC] = tmp;}
}

这段代码实现了一个将二维数组(矩阵)顺时针旋转90度的方法,采用边界逐层旋转的方式。

rotate() 方法中,使用四个变量来记录矩阵的左上角坐标和右下角坐标,并在 while 循环中不断收缩边界,对每一层使用 rotateEdge() 方法来旋转。

rotateEdge() 方法是旋转操作的核心,其中 times 记录当前层的元素个数,tmp 用于保存当前要旋转的元素,通过四个 for 循环分别完成旋转操作,具体如下:

  1. 将矩阵的右上角元素 m[dR][tC+i] 赋值给左上角元素 m[tR][tC+i]

  2. 将矩阵的左下角元素 m[dR-i][tC] 赋值给右上角元素 m[tR][tC+i]

  3. 将矩阵的左上角元素 m[dR][tC-i] 赋值给左下角元素 m[dR-i][tC]

  4. 将 tmp 值赋值给右下角元素 m[tR+i][dC]

在 rotateEdge() 方法中,使用 for 循环遍历每一层元素,i 从 0 开始,每次循环收缩一圈,直到完成该层所有元素的旋转。

二 “之”字形打印矩阵

【题目】给定一个矩阵matrix,按照“之”字形的方式打印这个矩阵,例如:

“之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11,8,12。

【要求】额外空间复杂度为O(1)。

要按照"之"字形的方式打印矩阵,我们可以根据打印方向分为两种情况:从左上到右下以及从右下到左上。我们可以使用两个变量来表示当前打印的行和列,根据当前行和列的奇偶性来确定打印顺序。

下面是按照"之"字形打印矩阵的 Java 代码实现:

public void printZMatrix(int[][] matrix) {if (matrix == null || matrix.length == 0) {return;}int row = matrix.length; // 矩阵行数int col = matrix[0].length; // 矩阵列数int tR = 0; // 左上角行坐标int tC = 0; // 左上角列坐标int dR = 0; // 右下角行坐标int dC = 0; // 右下角列坐标boolean fromUp = false; // 打印方向标志位,false 表示从右下到左上,true 表示从左上到右下while (tR < row) {printLevel(matrix, tR, tC, dR, dC, fromUp);// 更新左上角和右下角的坐标tR = tC == col - 1 ? tR + 1 : tR; // 如果当前列已经到达最后一列,则向下移动tC = tC == col - 1 ? tC : tC + 1; // 如果当前列已经到达最后一列,则不再向右移动dC = dR == row - 1 ? dC + 1 : dC; // 如果当前行已经到达最后一行,则向右移动dR = dR == row - 1 ? dR : dR + 1; // 如果当前行已经到达最后一行,则不再向下移动fromUp = !fromUp; // 改变打印方向}
}private void printLevel(int[][] matrix, int tR, int tC, int dR, int dC, boolean fromUp) {if (fromUp) { // 从左上到右下打印while (tR <= dR && tC >= dC) {System.out.print(matrix[tR++][tC--] + " ");}} else { // 从右下到左上打印while (dR >= tR && dC <= tC) {System.out.print(matrix[dR--][dC++] + " ");}}
}


  
以上代码中,printZMatrix() 方法用于控制行和列的遍历,根据打印的方向调用 printLevel() 方法来打印每一层的元素。

printLevel() 方法根据打印方向,使用 while 循环来打印每一层的元素,从左上到右下打印时,行坐标递增,列坐标递减;从右下到左上打印时,行坐标递减,列坐标递增。

希望以上代码能够帮助到你!如果你还有其他问题,请随时向我提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/200658.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

香港科技大学广州|机器人与自主系统学域博士招生宣讲会—同济大学专场!!!(暨全额奖学金政策)

在机器人和自主系统领域实现全球卓越—机器人与自主系统学域 硬核科研实验室&#xff0c;浓厚创新产学研氛围&#xff01; 教授亲临现场&#xff0c;面对面答疑解惑助攻申请&#xff01; 一经录取&#xff0c;享全额奖学金1.5万/月&#xff01; &#x1f559;时间&#xff1a;…

STM32 Flash

FLASH简介 Flash是常用的用于存储数据的半导体器件&#xff0c;它具有容量大&#xff0c;可重复擦写&#xff0c;按“扇区/块”擦除、掉电后数据可继续保存的特性。 常见的FLASH主要有NOR FLASH和NAND FLASH两种类型。NOR和NAND是两种数字门电路&#xff0c;可以简单地认为FL…

多线程的概念

点击链接返回标题-> 什么是进程&#xff1f; 进程&#xff08;Process&#xff09;&#xff0c;是程序的基本执行实体。 在早期面向进程设计的计算机结构中&#xff0c;进程是程序的基本执行实体&#xff1b; 在当代面向线程设计的计算机结构中&#xff0c;进程是线程的容器…

【阿里云】图像识别 摄像模块 语音模块

USB 摄像头模块测试及配置 一、首先将 USB 摄像头插入到 Orange Pi 开发板的 USB 接口中二、然后通过 lsmod 命令可以看到内核自动加载了下面的模块三、通过 v4l2-ctl 命令可以看到 USB 摄像头的设备节点信息为 /dev/video0四、使用 fswebcam 测试 USB 摄像头五、使用 motion …

opencv-简单图像处理

图像像素存储形式  对于只有黑白颜色的灰度图&#xff0c;为单通道&#xff0c;一个像素块对应矩阵中一个数字&#xff0c;数值为0到255, 其中0表示最暗&#xff08;黑色&#xff09; &#xff0c;255表示最亮&#xff08;白色&#xff09; 对于采用RGB模式的彩色图片&#…

人工智能基础_机器学习046_OVR模型多分类器的使用_逻辑回归OVR建模与概率预测---人工智能工作笔记0086

首先我们来看一下什么是OVR分类.我们知道sigmoid函数可以用来进行二分类,那么多分类怎么实现呢?其中一个方法就是使用OVR进行把多分类转换成二分类进行计算. OVR,全称One-vs-Rest,是一种将多分类问题转化为多个二分类子问题的策略。在这种策略中,多分类问题被分解为若干个二…

Startdrive中上传参数设置的具体方法和注意事项

Startdrive中上传参数设置的具体方法和注意事项 适用于配 SINAMICS S120、G130、G150、S150和MV(基于CU3x0-2的驱动器)和所有启动驱动器版本INAMICS G115D/G120/G120D/G120C/G120P/G110M(基于CU2x0-2的驱动器) 根据SINAMICS类型的不同,Startdrive中的Upload参数有所不同。…

js ::after简单实战

::after的作用是在元素后面再加个XXX样式 工作中遇到了一个表格&#xff0c;鼠标指到单元格要有个整行编辑态的效果&#xff0c;下面写个简单的demo 有人可能会说了&#xff0c;直接修改某个单元格的hover样式不就行了嘛&#xff0c;问题是如果鼠标指到单元格和单元格直接的…

第4章 向量、SIMD和GPU体系结构中的数据级并行

4.1 引言 有多少应用程序拥有大量的数据级并行DLP&#xff1f;SIMD分类Flyn被提出后5年。答案不仅包括科学运算中的矩阵运算&#xff0c;还包括面向多媒体的图像和声音处理以及机器学习算法。 由于SIMD可以执行多个数据操作&#xff0c;能效比MIMD要高&#xff0c;使得SIMD对…

CFCA证书——基于SM2/3算法的安全信任

在中国金融认证中心&#xff08;CFCA&#xff09;发行的证书中&#xff0c;采用了最新的国密SM2/3算法来提供更高的安全保障。这一创新举措进一步增强了我国网络安全能力&#xff0c;并为用户提供了一种更可靠、更安全的选择。 SM2/3算法是中国自主研发的非对称加密算法&#…

vue中原生H5拖拽排序_拖拽图片也是同样的道理

原文地址【vue中原生H5拖拽排序_拖拽图片也是同样的道理】 H5有基于拖拽的事件机制&#xff0c;如果你还不熟悉&#xff0c;请看我之前的文章【拖拽上传】中有介绍。 原生拖拽API实现 由于比较简单直接上代码了&#xff1a; <!DOCTYPE html> <html lang"en&qu…

QT专栏2 -Qt for Android

#2023年11月18日 # Qt version 6.6 JDK17 JDK 安装 Java Downloads | Oracle 设置环境变量 鼠标右键我的电脑&#xff0c;出现如下界面 Qt配置 改用JDK18&#xff0c;没有乱码&#xff0c;由于不影响APK产生。 做了好多尝试&#xff0c;更换JDK版本(11,18,19,21)&…

动手学深度学习(三)---Softmax回归

文章目录 一、理论知识图像分类数据集 softmax回归 一、理论知识 回归估计一个连续值分类预测一个离散类别 回归单连续数值输出自然区间R跟真实值的区别作为损失 分类通常多个输出输出i是预测为第i类的置信度 一般我们使用交叉熵用来衡量两个概率的区别 将它作为损失 其梯…

负载均衡Ribbon和Feign的使用与区别

Ribbon 的介绍 Spring Cloud Ribbon 是基于Netflix Ribbon 实现的一套客户端负载均衡的工具。主要功能是提供客户端的软件负载均衡和服务调用。Ribbon 客户端组件提供一系列完善的配置项如连接超时&#xff0c;重试等。简单的说&#xff0c;就是在配置文件中列出Load Balancer…

redis的高可用

1.redis的高可用 在集群当中有一个非常重要的指标&#xff0c;提供正常服务的时间的百分比&#xff08;365天&#xff09;99% redis的高可用含义更宽泛&#xff0c;正常服务是指标之一&#xff0c;数据容量的扩展&#xff0c;数据的安全性。 在redis中实现高可用技术&#x…

Oracle实时同步技术

Oracle数据库的价值 Oracle数据库是一种高度可靠、安全和强大的关系型数据库管理系统&#xff0c;它具有以下几个方面的价值&#xff1a; 可靠性和稳定性&#xff1a;Oracle数据库以其高度可靠性、稳定性和数据完整性而闻名于世。 安全性&#xff1a;Oracle数据库提供了一系列…

JVM的垃圾收集算法

1.算法的分类 1.1标记清除算法 第一步&#xff1a;标记&#xff08;找出内存中需要回收的对象&#xff0c;并且把它们标记出来&#xff09; 根据可达性算法&#xff0c;标记的是存活的对象&#xff0c;然后将其他的空间进行回收 第二步&#xff1a;清除&#xff08;清除掉被…

阿里云oss存储文件上传功能实现(保姆级教程)

先登录&#xff1a; 点击进入控制台 点击左上角导航栏按钮 搜索oss&#xff0c;点击进入 进入之后点击立即开通oss按钮&#xff0c;开通之后点击下图立即创建&#xff0c;弹出创建Bucket 填上Bucket名称&#xff0c;读写权限改为公共读。其他不变点击确定创建&#xff0c;完成…

LVS+keepalived——高可用集群

lvskeepalived&#xff1a;高可用集群 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用&#xff0c;于是keepalived这个软件。实现的是调度器的高可用。但是&#xff1a;keepalived不是专门为lvs集群服务的&#xff0c;也可以做其他代理服务器的高可用。 lvs的…

Spring Boot要如何学习?【云驻共创】

Spring Boot 是由 Pivotal 团队提供的全新框架&#xff0c;其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样板化的配置。我这里会分享一些学习Spring Boot的方法和干货&#xff0c;包括…